4月
13
2007
分類:
最近更新:
2007-04-13
PHP mail() and charset encoding question, part2 - mbstring
在 part1 中提到 mail()
會固定對信件內容進行編碼,而解決之道是改用 PHPMailer, PEAR::Mail 寄送信件。而本文則要繼續探索 mail()
對信件內容編碼之原因。
在一次測試過程中,我很偶然地、不小心地,打錯了 $headers 中 Content-type 的字元集(charset)之值,結果找到 mail()
寄信會造成亂碼的原因。
下例將故意字元集之值故意輸入成 'utf-X' (請將範例程式碼以 UTF-8 編碼格式儲存)。
結果 PHP 顯示了一則警告訊息,如下所示:
Warning: mb_send_mail(): Unsupported charset "utf-X" - will be regarded as ascii in ...
這下我明白了,凶手就是 mb_send_mail()
。原來 mail()
實際上已經被 mb_send_mail()
覆寫了,而 mb_send_mail()
會判讀 header 內容對信件內容編碼。這正是造成亂碼的原因。
我直覺想到這與 mbstring extension 有關。只要不載入 mbstring extension 或是在 php.ini 中設定 mbstring.func_overload = 6
(not overload mail()),那麼問題便可迎刃而解。我測試後確實可解,取消 mbstring.func_overload
對 mail()
之覆寫動作後, mail() 的行為跟以前一樣,不會對信件內容亂編碼。
但在實務上,有不少人是租用虛擬主機空間運行 PHP 程式。而那些虛擬主機供應商不可能允許用戶自行修改 php.ini 之內容。所以此處的解決方式不適合虛擬主機用戶,他們應採用 part1 的解決方式。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2998451.html
樂多舊回應