您好,登錄后才能下訂單哦!
這篇文章主要介紹了html郵件亂碼怎么辦,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
html郵件亂碼的解決辦法:1、在mail函數(shù)前一行打印message內(nèi)容;2、將郵件內(nèi)容保存為html文件后查看;3、設(shè)置UTF-8編碼。
本文操作環(huán)境:windows7系統(tǒng)、HTML5版、Dell G3電腦。
如何解決html郵件亂碼問題?mail 郵件內(nèi)容出現(xiàn)隨機亂碼
問題描述:
將數(shù)據(jù)(含中文)拼裝為html文件格式,發(fā)送郵件到指定用戶。
利用PHP中的mail函數(shù)
//拼裝header。指定編碼utf-8,解析郵件正文中的中文$headers = "From: xxx@xxx\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=utf-8\n"; $headers .= "Content-Transfer-Encoding: 8bit\n";//拼裝標題 解決中文標題亂碼問題$subject = xxx; $subject = "=?UTF-8?B?".base64_encode($subject)."?="; mail($toEmail,$subject,$message,$headers); // 其中$message為郵件內(nèi)容主題,格式形如"<html><head></head><body><p>".$title."</p>".$message.$table."</body></html>";
收到郵件正文部分隨機出現(xiàn)亂碼,非特殊字符,位置隨機,發(fā)送郵件到mac和windows收到郵件亂碼不一樣。
windows:隨機位置出現(xiàn)? 或!
Mac: 數(shù)據(jù)位置與傳入不一致,比如,應(yīng)為 xxxxAxxxxBxxxxx,收到的郵件為 xxxxBxxxxAxxxx
傳入數(shù)據(jù)不一樣時,有時會出現(xiàn)亂碼,有時不會出現(xiàn),對比與特殊字符也無關(guān)。
windows 亂碼形如:
排查:
1. 確認是否拼裝錯誤
直接在mail函數(shù)前一行打印message內(nèi)容,完整html格式,保存為html文件后打開。無亂碼,與預(yù)期所需吻合。
2. 確認收到郵件內(nèi)容
outlook查看郵件源文件(Mac可直接右擊,windows無此功能,后是保存為html文件后查看),發(fā)現(xiàn)亂碼處格式與步驟一中不一致。比如,標簽出現(xiàn) <!td>
3. 其他
其實到這一步就一直在懷疑php 的mail函數(shù)里究竟做了什么,是不是隱藏的PHP底層bug,傳輸過程改動了什么。卻沒有找到對應(yīng)源碼查看,此處徘徊很久。
又因為是中文亂碼,一再確認設(shè)置了UTF-8,搜索很多結(jié)果也是關(guān)于這個
另外mac上位置的錯亂有考慮到是否是傳輸截斷有問題,是不是長度太長導(dǎo)致
總結(jié)出來兩點
郵件內(nèi)容過長會導(dǎo)致解析問題
解決:Content-Transfer-Encoding: base64
問題一:郵件的長度限制依據(jù)是什么,長郵件該如何處理
php mail 方法的文檔里有注明上限(印象中超過長度會是截斷等處理,所以出現(xiàn)亂碼也沒想到是長度問題)
而php 基本方法設(shè)置上限的依據(jù)則是RFC 2822 2.1.1。
同時,它也提供了處理的建議,就是將文本內(nèi)容拆成多行。拼裝的html結(jié)構(gòu)則是一行,顯然是超過了長度。
問題二:為什么base64就可以解決郵件單行過長的問題
1. 理解base64是什么,參考了base64筆記 http://www.ruanyifeng.com/blog/2008/06/base64.html,簡單來說base64中的3個字節(jié)代表ASCII中的4個字節(jié)
2. 這和換行有什么關(guān)系呢?根據(jù)RFC822規(guī)定,BASE64Encoder編碼每76個字符,還需要加上一個回車換行
問題三:Content-Transfer-Encoding 取不同值代表什么?
參考:MIME筆記和 https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
個人理解,除了base64以外的方式都沒有插入換行的效果,也就無法解決問題
補充1:text類需要補充charset
補充2: "=?【編碼】?B?".base64_encode($subject)."?="; B代表 base64 Q代表quoted-printable
感謝你能夠認真閱讀完這篇文章,希望小編分享的“html郵件亂碼怎么辦”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。