第三步:讀取信件

接著要讀取出信件內容,在IMAP中每一封信件有兩種編號:1.信件的uID(唯一)2.信件在信件夾中的編號msgno,透過imap_search搜尋到的內容中記錄的是後者,要經過imap_uid(mail,msgno)轉換為為uID。但是在讀取信件時後,必須使用後者的編號,所以必須再透過imap_msgno(mail,uid)轉換回msgno,這裡要特別注意!

//開啟信箱
$mbox = imap_open ($mail_link,$mail_user,$mail_pass);
//讀取信件
$headers = imap_headers($mbox);
//信箱裡沒有信
if (!gettype($headers)=="array"){
	echo "錯誤,信箱中沒有信件,請退回上一頁";
	exit();
}
//用msgID取得msgNo
$miail_msgno=imap_msgno($mbox,$mailid);
//讀取指定msg的表頭
$mail_list = imap_headerinfo($mbox, $miail_msgno)
or die("<br />錯誤,無法開啟該郵件,請退回上一頁".'<p>');

if (!gettype($mail_list)=="object"){
	echo "錯誤,無法開啟該郵件,請退回上一頁";
	exit();
}

//判定使用者權限(檢查該信件是否是寄給$_SESSION["mail_mail"]的)
$tmp_mail=eregi_replace(".",".",$_SESSION["mail_mail"]);
if (!eregi($tmp_mail,$mail_list->toaddress)){
	echo "錯誤,你沒有權限開啟此信件,請退回上一頁";
}else{
	//讀取指定msg的subject
	$tmp_subject = HTMLFormatSender(decode_mime_string($mail_list-&gtsubject,"UTF-8"));
	$tmp_subject=($tmp_subject=="")?"無標題":$tmp_subject;
	//讀取指定msg的body格式
	$mail_bodystruct=imap_bodystruct($mbox,imap_msgno($mbox,$mailid),1 );
	//判斷body格式,1:一般格式 4:qp格式
	if ($mail_bodystruct->encoding=="1"){
		//讀取指定msg的body
		$mail_body=imap_fetchbody($mbox,imap_msgno($mbox,$mailid),1);
		//print_r($mail_body);
		//讀取指定msg的0區塊編碼方式
		$mail_codeset=$mail_bodystruct->parameters[0]->value;
		//如果為gb2312編碼必須改用bgk才能正常顯示
		if (strtolower($mail_codeset)=="gb2312") $mail_codeset="GBK";
		//編碼轉換
		$mail_body=mb_convert_encoding($mail_body,"UTF-8",$mail_codeset);
		//標籤去除
		$mail_body=HTMLFormatSender($mail_body);
		//換行設置
		$mail_body=ereg_replace("n","<br />",$mail_body);
	}elseif( $mail_bodystruct->encoding=="3"){
		//讀取指定msg的body
		$mail_body=imap_fetchbody($mbox,imap_msgno($mbox,$mailid),1);
		//print_r($mail_body);
		//讀取指定msg的0區塊編碼方式
		$mail_codeset=$mail_bodystruct->parameters[0]->value;
		//如果為gb2312編碼必須改用bgk才能正常顯示
		if (strtolower($mail_codeset)=="gb2312") $mail_codeset="GBK";
		$mail_body=base64_decode($mail_body);
		//編碼轉換
		$mail_body=mb_convert_encoding($mail_body,"UTF-8",$mail_codeset);
		//標籤去除
		$mail_body=HTMLFormatSender($mail_body);
		//換行設置
		$mail_body=ereg_replace("n","<br />",$mail_body);
	}else{
		//讀取指定msg的body
		$mail_body=imap_fetchbody($mbox,imap_msgno($mbox,$mailid),1);
		//print_r($mail_body);
		//讀取指定msg的0區塊編碼方式
		$mail_codeset=$mail_bodystruct->parameters[0]->value;
		//qp轉換
		$mail_body=decode_qp($mail_body);
		//編碼轉換
		$mail_body=mb_convert_encoding($mail_body,"UTF-8",$mail_codeset);
		//標籤去除
		$mail_body=HTMLFormatSender($mail_body);
		//換行設置
		$mail_body=ereg_replace("n","<br />",$mail_body);
	}	

	echo "<h2>讀取信件</h2>";
	echo '<table id="MessageList">';
	echo "<tr>";
	echo "<td>寄件者</td>";
	echo "<td>".HTMLFormatSender(decode_mime_string($mail_list->fromaddress,"UTF-8"))."</td>";
	echo "</tr>";
	echo "<tr>";
	echo "<td>收件者</td>";
	echo "<td>".HTMLFormatSender(decode_mime_string($mail_list->toaddress,"UTF-8"))."</td>";
	echo "</tr>";
	echo "<tr>";
	echo "<td>標題</td>";
	echo "<td>".$tmp_subject."</td>";
	echo "</tr>";
	echo "<tr>";
	echo "<td>日期</td>";
	echo "<td>".HTMLFormatSender($mail_list->MailDate)."</td>";
	echo "</tr>";
	echo "<tr>";
	echo "<td>內容</td>";
	echo "<td>".$mail_body."</td>";
	echo "</tr>";
	echo "</table>";
}//判定使用者權限

//關閉imap
imap_close($mbox);

在MAIL的header中包含了許多組的BODY,通常第一組為信件的內容,其餘的可能為附件。所以程式透先過imap_bodystruct讀取第一個BODY的內容,其中包含該BODY的編碼方式encoding。encoding代表的意義1:一般格式3:base64格式4:qp格式(2我還沒有碰到,目前還不清楚)

第四步:當信箱到期時,清除SESSION

$time_now=time();
$time_due=$_SESSION["mail_duetime"];
if ($time_now<$time_due){
	echo "您的Emial為:".$_SESSION["mail_mail"]."<br />";
	echo "建立時間為:".date("Y-m-d H:i:s",$_SESSION["mail_get_time"])."<br />";
	echo "到期時間為:".date("Y-m-d H:i:s",$_SESSION["mail_duetime"])."<br />";
	echo "剩下";
	echo $_SESSION["mail_duetime"]-time();
	echo "秒<br />";
}else{
	echo "您的Email已失效";
	$_SESSION["mail_user"]="";
	$_SESSION["mail_mail"]="";
	$_SESSION["mail_get_time"]="";
	$_SESSION["mail_duetime"]="";
}

這麼多程式碼看的都暈了吧!?其實不難,主要是處理郵件編碼比較複雜而已,等我有空我再把他們都包成CLASS吧!

http://10minutemail.net/是我最近完成的,可以達到10分鐘電子信箱的效果,歡迎批評指教!(網址方面就不要太苛求了XD)