Focalmail加上解碼程式

 

89/3/17

林朝敏

Focalmail 一套免費而且方便的 web-email , 可是有一個重大的缺點,就是無法解開郵件編碼,常會一片亂碼無法閱讀。而這部份卻是中文下容易遇到的情形,除了要求他人寄來的信不再設定編碼外,有什麼別的辦法呢?

最近開始學習php,也就以此為練習題。但有太多的地方不了解,只是想辦法來解決,可能也不是個很好解決法!我稱之為鋸箭法,把眼前的問題部份去掉罷了!

好了!開始鋸箭吧!

編過碼的主旨類似 "=?big5?B?uvSs9rzGpuym5r5QX1NoYXJvbg==?=",把前方的 =?big5?B? 及後方的 ==?= 去掉,就是base64編碼了。

寫一個有關於編碼部份的程式 big5mime.php3

<?      //big5mime.php3  

 function subject_decode($p) {
//=?big5?B? ?= 的編碼解開 ,判斷起始記號
$begn = strpos($p ,"=?") ;
$endn = strpos($p , "?=") ;
//有編碼
if ($endn >0) {
//編碼前有英文字串
if ($begn > 0) {
$sp = substr($p,0,$begn) ;
}

//編碼後有英文字串
if ((strlen($p) -$endn)> 2) {
$ep = substr($p,$endn+2 , strlen($p)-$endn-2) ;
}

$np = substr($p,0, $endn - strlen($p) );

//?big5?B? 之後的第一個編碼字
$secd = strrpos($np,"?") ;
//要解碼的文字
$np = substr($np,$secd+1 ,strlen($np)-$secd);
$p = $sp . imap_base64($np) . $ep ;

return $p ; 
}

function message_decode($mailstream,$messageid,$bodypart,$encode) {
//信件內容的判斷
$message =imap_fetchbody($mailstream,$messageid,$bodypart);
if ($encode->encoding == 3) {
$message = imap_base64($message) ;
}
if ($encode->encoding == 4 ) {
$message = imap_qprint($message) ;
}
return $message ;
}

?>

要修改檔案分別為 mailbox.php3 , message.php3 , reply.php3 , forward.php3 四個程式。

<?
  include ("big5mime.php3") ;
  //把函數叫進來

$subject=$headerinfo->Subject;
//=?big5?B? ?= 的編碼解開 ,判斷起始記號
$subject=subject_decode($subject);        //加入這一行
?>

除了mailbox.php3外,其他三個程式要修改

<?

//內容做解碼動作
$encode = $partinfo->parts[0] ;         //加入這一行
//$message =imap_fetchbody($mailstream,$messageid,$bodypart);
$message =message_decode($mailstream,$messageid,$bodypart,$encode);                         //修改成這樣           

?>


而在 reply.php3 、forward.php3 中的回信主旨,會出現只有 "RE:" 而無文字的情形(其中有空白,之後的部份會不見,不知為什麼?)需再做修改,在 <? echo ($subject); ?>,加上" "(雙引號),如下:

<input type"text" name="subject" size=30 value="<? echo ($subject); ?>"></font></td>

後記

信件標題的解碼,如果設定為 big5的,應該可以正確解開(試過OutLook、Netscape、Becky)。但如果設定為其他的地區,我可沒有把握!大家再來試試吧!
我把修改後的檔案放在學校的ftp站上,你可以由些下載
另一套webmail(imp) 的解碼很正確,原本要去查看他這部份程式的寫法,但相對的 imp 的程式碼,寫得架構頗大,不容易找到。