jmail4.4pro接收邮件,标题出现乱码,内容却正常显示(标题和内容都是utf8编码)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jmail4.4pro接收邮件,标题出现乱码,内容却正常显示(标题和内容都是utf8编码)相关的知识,希望对你有一定的参考价值。

发送邮件代码:
string FromMail = "tangsiyanking@sina.com";//发件人
string Title = "mailnow测试邮件"; //邮件主题
string Body = "这是mailnow测试邮件"; //邮件主体
string ShowName = "paladintsy";//显示名字
string MailUserName = "tangsiyanking";
string MailPassword = "xxxxxx";//密码,俺就不给了。。。
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.From = new MailAddress(FromMail, ShowName, System.Text.Encoding.UTF8);
msg.Subject = Title;//邮件标题
msg.SubjectEncoding = System.Text.Encoding.UTF8;//标题采用UTF8编码
msg.Body = Body;//邮件内容
msg.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码采用utf8

msg.To.Add("seu_tangsiyan@qq.com");//收件人
邮件成功发送后,邮件内容通过直接登录QQ邮箱或者用WindowsLiveMail收取到本地都可以正常显示。但是用jmail收取以后在控制台中显示内容,却发现标题是乱码,而邮件内容是正常显示的。下面给出收邮件的部分代码:
string subject;
string body;
jmail.Message jmsg = new jmail.Message();//生成jmail邮件对象
jmail.POP3 jpop = new jmail.POP3();//生成POP3对象,用于连接服务器
jmail.Attachments atts = new jmail.Attachments();//附件集合对象
jmail.Attachment att = new jmail.Attachment();//附件对象
jpop.Connect("seu_tangsiyan","xxxxxx","pop.qq.com",110);//连接服务器,4个参数依次为用户名,密码,服务器地址,端口号
jmsg = jpop.Messages[i];//取得第i封邮件,注意这个数组下标从1开始
atts = jmsg.Attachments;//取得邮件的所有附件
if (jmsg.ContentType == "text/plain")

body = jmsg.Body;
subject = jmsg.Subject;//得到邮件标题
Console.WriteLine(subject);
Console.WriteLine(body);

................................
我已经快被这个问题折磨疯了,上网搜了两天了,都没有解决问题,大多数结果都是解决jmail发送邮件出现乱码的,可是我发送邮件用的是.net自带的类,所以不应该是这些原因。求求各位帮帮我吧。。。。万谢。。。

参考技术A 1.根本设置 对OutlookExpress进行根本设置,可彻底解决电子邮件的乱码。打开OutlookExpress后,选择“工具”→“选项”命令,单击“阅读”标签,再单击“字体”按钮,选择“简体中文(GB2312)”,同时把它设置为默认值。接下来,单击“国际设置”按钮,选中“为接收的所有的邮件使用默认的编码”,确定退出。如此设置后,当你打开所有邮件,通常都不会再出现乱码了。
2.选项查看 通常情况下,没有进行上述邮件设置,导致邮件乱码情况居多。在OutlookExpress中,选择乱码邮件后,单击“查看”→“编码”→“简体中文(GB2312)”或“其他”→“简体中文(HZ)”,邮件内容即可展现。
3.转寄再收 如仍显示乱码,可试着将乱码邮件转寄到自己的邮箱中,然后用OutlookExpress接收,有时即可顺利解码。
4.改名重读 仍然不行可将邮件改名,存成一个后缀名为.eml的文件,由OutlookExpress打开一般都可以自动解码。
5.追根溯源 对于采用不同编码标准产生的乱码邮件,解码工作比较专业,说起来会很生涩。我们不妨选择乱码邮件后,右键单击鼠标,在弹出的快捷菜单中选择“属性”命令,接着在出现的对话框中单击“详细资料”标签,再单击“邮件源文件”按钮,这时就会打开邮件源文件码,邮件内容显现。
6.巧妙骗解 如问题仍得不到解决,接上一步操作,右键单击,选“复制”,将“邮件源文件”拷贝到系统的剪贴板上,然后用记事本将其打开。在邮件信头中添加Mime-Version:1.0Content-Transfer-Encoding:quoted-printable,注意信头中间不要空行,信头和信体之间要有一个空行,保存为.txt纯文本文件。接下来用资源管理器将其改名为.uue为后缀的文件并运行,这时会自动调用WinZip并“骗取”它来对乱码邮件进行解码工作,进而正确显示编码邮件的“庐山真面目”。
7.代码替换 将乱码邮件存为一个.eml的文件,用记事本打开。然后打开一个正常邮件,选择并复制一呗代码:
Content-Type:text:/plain;
charset=“GB2312”
Content-Transfer-Encoding:quotedprintable
替换粘贴到乱码邮件的相应位置,保存后关闭邮件。这时乱码邮件变为正常邮件。
8.优化重组 很多的邮件编辑软件以字符为单位处理文本,双字节的汉字被删除一半后,剩余部分会和相邻的汉字重新组合,使得文本面目全非。我们收到的绝大多数邮件属于此类。判断这类邮件时,只要乱码内容有很多“=”号,即可肯定为QP编码的邮件。这时我们需要将乱码邮件存成一个文本文件,然后使用以字符为单位的编辑软件,将乱码行的第一个字符删除。笔者有一个很笨但十分有效的办法,就是将乱码连接起来,不管多长,发现内容之间有两个“=”号,去掉其中的一个多余“=”号,后面的部分就会和相邻的乱码重新组成可识别的汉字。如果以上方法均不能奏效,则可以判断收到的乱码邮件未经过编码造成第8位字节滤掉而成为无法还原的死乱码文档,只好请对方重发邮件给你了。
参考技术B net自带的会乱码,用Jmail发吧

mail 邮件内容出现随机乱码

问题描述:

将数据(含中文)拼装为html文件格式,发送邮件到指定用户。

利用PHP中的mail函数

//拼装header。指定编码utf-8,解析邮件正文中的中文
$headers = "From: [email protected]
";
$headers .= "MIME-Version: 1.0
";
$headers .= "Content-type: text/html; charset=utf-8
";
$headers .= "Content-Transfer-Encoding: 8bit
";
//拼装标题  解决中文标题乱码问题
$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结构则是一行,显然是超过了长度。

问题二:为什么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

 

以上是关于jmail4.4pro接收邮件,标题出现乱码,内容却正常显示(标题和内容都是utf8编码)的主要内容,如果未能解决你的问题,请参考以下文章

我发送的邮件人家怎么看着是乱码??

java 接收邮件附件乱码

邮件内容经常出现乱码,用编码去转换也不行,如何解决?

mail 邮件内容出现随机乱码

为啥通过 Multipeer Connectivity 发送的字符串在接收端会出现乱码?

Java 发送邮件是出现乱码 乱码结果如下: