最近遇到一個問題,就是在使用php的mail函數發送utf-8編碼的中文郵件時標題出現亂碼現象,而郵件正文卻是正確的。最初以爲是頁面編碼的問題,發現頁面編碼utf-8沒有問題啊,找了半天原因,最後找到了問題所在。
1.使用 PEAR 的 Mail 類
PEAR 的 Mail 類可以讓你選擇使用 sendmail 或者 SMTP 方式發信,這樣的包裝好的接口很好用,你沒有必要去自己重新發明輪子。
2.關於headers 中subject 的亂碼
不要把任何除了 iso-8859-1 編碼之外的文字直接放進subject,正確的方式是讓subject 裏頭的文字符合RFC 2047 的規範,假設你的subject 處的文字的編碼是GB2312,那麼正確的subject 應該是這樣的格式
$headers['subject'] = '=?GB2312?B?' . base64_encode('標題文字') . '?=';
如果是UTF-8 的話,把上面開頭的GB2312 替換成UTF-8 即可。推薦在標題處使用GB2312 編碼,因爲MTA 的分化實在是嚴重,大部分的MSP使用的都是自己開發的 MTA,而相信國內的大部分 MTA 無論如何都是可以支持 GB2312 編碼的。
而如果是發送到國外的MSP,則推薦你在subject 處使用經過base64 編碼的 UTF-8 文字,因爲他們很可能不支持 GB2312 編碼。
3.一定在headers 中添加content-type
電子郵件的 headers 中的 content-type 處類似網頁的,也是 text/plain; charset=gb2312 這樣的格式。這個選項主要對收郵件的客戶端有意義,可以避免在客戶端出現亂碼,部分的 Webmail 也會根據這裏的設置對郵件的內容進行編碼轉換以正確顯示。你可以設想一下你用 gb2312 編碼發到 .com.tw 的郵箱時候的情況。
4.對你用來發送郵件的主機進行正確配置
1)一定配置反向解析,因爲大部分的非固定 IP 都無法做反向解析,部分反垃圾郵件策略以此作爲判斷依據。
2)一定配置 MX 解析,道理同上。
3)確保你的 return path 是能夠收到退信的,否則你的郵件發送服務器可能會進入接收端的黑名單。
1 2 3 4 5 6 |
|
先用函數base64_encode() — 使用MIME base64 對數據進行編碼
標題字符串前加編碼類型例如: =?UTF-8?B?
標題字符串後加:?=
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
這樣,發送的中文郵件標題就不是亂碼了。
是不是很簡單,其實把問題分析透了,所有的問題都會迎刃而解了,希望這篇文章對大家的學習有所幫助。