石頭閒語:PHP mail() and charset encoding question – 樂多日誌
不知從何時開始, PHP 內建的 mail() 行為改變了,使用 mail() 寄發電子郵件時,似乎會固定將內文之字元編碼轉為 iso-8859-1 字元集。於是用 mail() 寄中文郵件時變亂碼、寄東歐文字郵件時變亂碼、寄日文郵件時變亂碼等等問題一一出現。如何寄非英文語系郵件幾乎成了 FAQ 級問題。早期的 mail() 並沒有這種狀況。基本上只要在信件的標頭欄位中添加文件型態及字元集(charset)資訊,如 ‘Content-type: text/plain; charset="big5″‘ 即可用以寄發中文郵件。但不知何時開始,這種方式不再適用。在 PHP manual 中也未提到這方面的變化,僅僅說可用 PEAR::Mail 完成更複雜郵件寄送工作。另外隱晦地加上 mb_send_mail() ,表示應該使用此一函數寄發多位元組字元集文字郵件。
為了測試前述問題所在,以及完成寄送中文郵件的工作,我設計了一個替用的 mail 函數。對於了解 SMTP 協定內容的程序員而言,要自行設計一個 mail() 並不困難。下列便是我設計的 mail() 替用函數。它是一個對照組,用以測試並確認郵件內容變亂碼是 PHP 內建的 mail() 所造成的。由於設計目的之中包含了測試用途,所以程式碼中還留有觀察訊息的敘述。