`

JavaMail发送中文邮件中主题乱码的解决方法

 
阅读更多

我们的程序经常会出现这样一个问题,在WinXp下测试是正常的,而到了服务器(Linux操作系统)上就出现这个问题。


1、由于邮件我写的程序的邮件主题是写在配置文件(.properties)中的,再通过native2ascii把中文邮件主题从本地码(简体中文WindXp是GBK)转换为Unicode编码。而Java程序读取properties配置文件内容时,是根据操作的编码方式来读取的,这样就造成程序的可移植性差。
2、没有指定邮件主题的编码方式
当一段Text或者HTML通过电子邮件传送时,发送的内容首先通过一种指定的字符编码转化成“字节串”,然后再把“字节串”通过一种指定的传输编码(Content-Transfer-Encoding)进行转化得到另一串“字节串”。比如,打开一封电子邮件源代码,可以看到类似的内容:
Content-Type:text/plain;charset="gb2312"
Content-Transfer-Encoding:base64
sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==
最常用的Content-Transfer-Encoding有Base64和Quoted-Printable两种。在对二进制文件或者中文文本进行转化时,Base64得到的“字节串”比Quoted-Printable更短。在对英文文本进行转化时,Quoted-Printable得到的“字节串”比Base64更短。
邮件的标题,用了一种更简短的格式来标注“字符编码”和“传输编码”。比如,标题内容为"中",则在邮件源代码中表示为:
//正确的标题格式
Subject:=?GB2312?B?1tA=?=
其中,
第一个“=?”与“?”中间的部分指定了字符编码,在这个例子中指定的是GB2312。
“?”与“?”中间的“B”代表Base64。如果是“Q”则代表Quoted-Printable。
最后“?”与“?=”之间的部分,就是经过GB2312转化成字节串,再经过Base64转化后的标题内容。
如果“传输编码”改为Quoted-Printable,同样,如果标题内容为"中":
//正确的标题格式
Subject:=?GB2312?Q?=D6=D0?=
如果阅读邮件时出现乱码,一般是因为“字符编码”或“传输编码”指定有误,或者是没有指定。比如,有的发邮件组件在发送邮件时,标题"中":
//错误的标题格式
Subject:=?ISO-8859-1?Q?=D6=D0?=
这样的表示,实际上是明确指明了标题为[0x00D6,0x00D0],即"ÖÐ",而不是"中"。
3、解决方法
(1):修改操作系统编码方式为GBK,或在服务器上通过native2ascii把邮件主题重新生成Unicode编码,并更新配置文件内容;
(2):给邮件主题指定编码方式:
sun.misc.BASE64Encoderenc=newsun.misc.BASE64Encoder();
msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");


建议:带有中文的配置文件,尽量不用*.properties文件,而用XML文件替代;
分享到:
评论

相关推荐

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码 查看debug 邮件处理过程发现邮件头没有编译, 内容是base64编码,所以邮箱收不到或者收到的是base64编码后的一堆乱码,

    javamail发送邮件 主题乱码解决

    第90行,setSubject("")

    使用JavaMail发送复杂邮件源代码

    利用JavaMail进行邮件开发的发邮件的源代码,其中有四个例子,demo1/demo2是发送简单的邮件,demo3是发送一封html格式(正文为html格式,html代码中有一张图片)带附件的邮件。demo4是对demo3的补充,解决了附件的...

    jsp/servlet javamail 发送邮件 可发送多个附件

    jsp/servlet 模式的发送邮件系统 可发送多个附件 存在的问题为 subject可能会乱码 有问题可以给我留言

    SpringBoot mail中文附件乱码的解决方法

    本篇文章主要介绍了SpringBoot mail中文附件乱码的解决方法,非常具有实用价值,需要的朋友可以参考下

    JavaMail组件在网站用户注册系统中的应用.pdf

    本文首先阐述了用户注册系统将用户登录密码发送至用户电子邮箱这一应用的优越性和必要性,并对实现该功能的JavaMail API ...最后详细讲述了电子邮件自动发送功能的实现、功能的扩展以及实现过程中常见的中文乱码问题。

    spring整合freemarker发送邮件例子

    spring整合freemarker实现发送邮件, html中内嵌图片,添加附件, 解决乱码问题.

    Java学习笔记

    5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、用Session保存登录信息 9、面向对象分析通常分为三个步骤 10、使用DataSource接口连接数据源 11、避免表单重复提交的技术 ...

    V512工作室Java web的ppt

    第16章 讲解使用Apache Commons FileUpload实现文件上传,同时讲解了JavaMail和如何运用Apache Commons Email组件发送邮件。 第17章 讲解DAO设计模式和分页显示,同时还讲解了Displaytag与Pager标记库。 第18章讲解...

    JSP网站开发典型模块与实例精讲

     2.2.7 使用JavaMail发送注册验证邮件  2.2.8 独家见解——在前台还是后台验证  2.2.8 数据有效性  2.3 实现用户登录  2.3.1 创建登录输入表单  2.3.2 验证用户名及密码是否正确  2.3.3 指点迷津——...

Global site tag (gtag.js) - Google Analytics