2006年9月15日 星期五

[修正]解決V-webmail寄出郵件的主旨亂碼

開始試用 V-webmail 時,第一件令人困擾的事,就是寄出去的信件,中文的郵件主旨都會變成亂碼。經過一番追查找到問題所在了,追根究底,都是一些老問題,老外寫的程式,對東方語系總有考慮不周的地方。

在寄出信件的部份, V-webmail 使用 HTML Mime Mail class 做為 SMTP client 。在 google 這個 class 時,發現這個 class 似乎還蠻有名的,很多 PHP Base web AP 都用它做為 SMTP client 的樣子。這個 class 本身不是造成亂碼的問題,而是 class 內部是以 ISO-8859-1 做為建立郵件時的預設字集。而 V-webmail 的寄信程式 email.compost.php 裡面,只替純文字的郵件本文設定了使用語系檔裡的字元集設定,所以 header 部份還是以預設的 ISO-8859-1 做編碼,於是乎,別的 email client 讀信時便以錯誤的方式解碼檔頭的中文訊息,標題和寄件者、收件者裡的中文名字等就遭殃了。

解決的方法如下:

在 htdocs/email.compose.php 裡面,找到建立郵件的程式碼 (第 361 - 369 行) ,修改程式碼如下:

$build_params = array();
if (preg_match('/[x80-xFF]+/', $SESSION['email_compose']['text'])) {
$build_params['text_encoding'] = 'quoted-printable';
$build_params['text_charset'] = lang('ISO-8859-1');
//加入下面兩行,指定 html 格式郵件和檔頭也行語系檔取得字元集設定
$build_params['html_charset'] = lang('ISO-8859-1');
$build_params['head_charset'] = lang('ISO-8859-1');

}

if (!$mimeObj->buildMessage($build_params)) {
common::redirect('email.compose.php', lang('Failed to build message'));
}

經過這麼一改, V-webmail 寄出郵件時,主旨及檔頭其他部分的中文就可以顯示了。目前已經回報到官方 bug tracker issue 119 了。

搞定了嗎?還沒,因為中文是有了,但是 Big5 衝碼字的問題還是存在的,這就跟 HTML Mime Mail class 有關了。這部份就下回待續吧。

沒有留言:

張貼留言