|
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 的程式碼,寫得架構頗大,不容易找到。 |
|