您好,欢迎访问一九零五行业门户网

如何解决html邮件乱码问题

html邮件乱码的解决办法:1、在mail函数前一行打印message内容;2、将邮件内容保存为html文件后查看;3、设置utf-8编码。
本文操作环境:windows7系统、html5版、dell g3电脑。
如何解决html邮件乱码问题?mail 邮件内容出现随机乱码
问题描述:
将数据(含中文)拼装为html文件格式,发送邮件到指定用户。
利用php中的mail函数
//拼装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为邮件内容主题,格式形如<html><head></head><body><p>.$title.</p>.$message.$table.</body></html>;
收到邮件正文部分随机出现乱码,非特殊字符,位置随机,发送邮件到mac和windows收到邮件乱码不一样。
windows:随机位置出现? 或!mac: 数据位置与传入不一致,比如,应为 xxxxaxxxxbxxxxx,收到的邮件为 xxxxbxxxxaxxxx传入数据不一样时,有时会出现乱码,有时不会出现,对比与特殊字符也无关。
windows 乱码形如:
 排查:
 1. 确认是否拼装错误
直接在mail函数前一行打印message内容,完整html格式,保存为html文件后打开。无乱码,与预期所需吻合。
2. 确认收到邮件内容
outlook查看邮件源文件(mac可直接右击,windows无此功能,后是保存为html文件后查看),发现乱码处格式与步骤一中不一致。比如,标签出现 <!td>
3. 其他
其实到这一步就一直在怀疑php 的mail函数里究竟做了什么,是不是隐藏的php底层bug,传输过程改动了什么。却没有找到对应源码查看,此处徘徊很久。
又因为是中文乱码,一再确认设置了utf-8,搜索很多结果也是关于这个
另外mac上位置的错乱有考虑到是否是传输截断有问题,是不是长度太长导致
转机:https://www.cnblogs.com/puzbus/archive/2013/06/07/3356342.html
总结出来两点
邮件内容过长会导致解析问题解决:content-transfer-encoding: base64复盘补充:问题一:邮件的长度限制依据是什么,长邮件该如何处理
php mail 方法的文档里有注明上限(印象中超过长度会是截断等处理,所以出现乱码也没想到是长度问题)
而php 基本方法设置上限的依据则是rfc 2822 2.1.1。
同时,它也提供了处理的建议,就是将文本内容拆成多行。拼装的html结构则是一行,显然是超过了长度。
【推荐学习:html视频教程】
问题二:为什么base64就可以解决邮件单行过长的问题
1. 理解base64是什么,参考了base64笔记 http://www.ruanyifeng.com/blog/2008/06/base64.html,简单来说base64中的3个字节代表ascii中的4个字节
2. 这和换行有什么关系呢?根据rfc822规定,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邮件乱码问题的详细内容。
其它类似信息

推荐信息