由於我有安裝 WordPress Database Backup 和 Spam Karma 2 這兩個 Plugins ,加上我的 Blog 標題是 Non-ASCII 的文字(我是用 UTF-8 編碼),所以常發生收信收到亂碼的窘境!
經過 Google 大神一番查詢和整理,終於找出了解決的方法。 XD
因為 RFC 822 規定標頭訊息(message headers)得用 ASCII 來編碼,所以當你使用 Non-ASCII 的文字做為你的內容時(像是 “螺絲起子” 是中文,用 UTF-8 編碼),就會發生亂碼的狀況。
畢竟 RFC 822 是早期訂定的東西,沒有考慮這麼的多,所以後續就產生了 RFC 2047 來解決這個惱人的問題。
在這邊也不打算要講道,我就跳過一些比較細節的部份,直接來講解決的方法(其實是怕多講多錯 XD)。
方法 1: 使用 “Base64 ”
1 | $encode = "=?UTF-8?B?" . base64_encode($subject) . "?="; |
方法 2: 使用 “Quoted-Printable”
1 | $encode = "=?UTF-8?Q?" . tr_replace("?","=3F",imap_8bit($subject)) . "?="; |
基本上是建議先用 phpinfo() 來看看哪個 extension 已經安裝,再來選擇要使用哪個方法,反正兩個都通。至於兩者的執行效率,因為沒經過測試,所以這邊就不討論啦!
在這邊以修改 WordPress 的 function wp_mail 來做示範。
{WordPress安裝位置}/wp-includes/pluggable.php 約 165 行那邊。
原始碼:
1 | return @mail($to, $subject, $message, $headers); |
修改後 (Base64):
1 2 | $encode = "=?UTF-8?B?" . base64_encode($subject) . "?="; return @mail($to, $encode, $message, $headers); |
修改後 (Quoted-Printable):
1 2 | $encode = "=?UTF-8?Q?" . tr_replace("?","=3F",imap_8bit($subject)) . "?="; return @mail($to, $encode, $message, $headers); |
會挑 wp_mail 這個 function ,主要是因為 WordPress 裡,不管是主要的程式還是其他的 Plugins ,只要是有用到寄信的功能,都會以它為第一個優先考量。
簡單的講,修改了這部份,以後就不用一個一個的修改程式碼,呵呵呵。
Discussion
No comments for “解決 PHP 信件主旨產生亂碼”
Post a comment