来源:http://blog.csdn.net/DR_LF/archive/2010/11/17/6014818.aspx
编码
邮件头(参见RFC822,RFC2047)只能包含US-ASCII字符。邮件头中任何包含非US-ASCII字符的部分必须进行编码,
使其只包含US-ASCII字符。所以使用java mail发送中文邮件必须经过编码,否则别人收到你的邮件只能是乱码一堆。
不过使用java mail 包的解决方法很简单,用它自带的MimeUtility工具中encode开头的方法(如encodeText)
对中文信息进行编码就可以了。
例子:
MimeMessage mimeMsg = new MimeMessage(mailSession);
//让javamail决定用什么方式来编码 ,编码内容的字符集是系统字符集mimeMsg.setSubject( MimeUtility.encodeText( Subject) );
//使用指定的base64方式编码,并指定编码内容的字符集是gb2312
mimeMsg.setSubject( MimeUtility.encodeText( Subject,”gb2312”,”B”));
通常对邮件头的编码方式有2种,
一种是base64方式编码,一种是QP(quoted-printable)方式编码,javamail根据具体情况来选择编码方式。
如“txt测试”编码后内容如下:
=?GBK?Q?Txt=B2=E2=CA=D4
里面有个=?GBK?Q?,GBK表示的是内容的字符集,?Q?表示的是以QP方式编码的,后面紧跟的才是编码后的中文字符。所以用MimeUtility工具
编码后的信息里包含了编码方式的信息。
(上面的不用开发人员自己处理,API已经处理好了,直接交给他们处理就好了)
邮件的正文也要进行编码,但它不能用MimeUtility里的方法来编码。
邮件正文的编码方式的信息是要放在Content-Transfer-Encoding这个邮件头参数中的,而MimeUtility里面的方法是将编码方式的信息放在编
码后的正文内容中。所以如果你对正文也用MimeUtility进行处理,那么其他邮件程序就不
会正常显示你编码的邮件,因为其他邮件软件如outlook,foxmail只会根据Content-Transfer-Encoding
这个里面的信息来对邮件正文进行解码。
其实,邮件正文部分的编码javamail已经自动帮你做了,当你发送邮件的时候,它会自己决定编码方式,并把编码方式的信息放入Content-
Transfer-Encoding这个邮件头参数中,然后再发送。所以你所要做的就是直接把邮件正文的内容放入邮件中就可以了。
(
MimeMessage mime = mailSender.createMimeMessage();
MimeMessageHelper helper;
.......
//之前设置为UTF-8,在某些接收的邮件服务器中有乱码的情况,改成GBK就好了
//邮件的内容,直接放入就行
helper = new MimeMessageHelper(mime, true, "GBK");
)
对邮件正文的编码方式比较多,包括了base64和QP方式,还有一些如7bit,8bit等等,因为javamail自动为邮件正文编码,所以我就不一一祥
叙了。
例子:
//处理邮件正文
MimeBodyPart mbp=new MimeBodyPart();
if ( ContentType() == null || ContentType.equals(""))
mbp.setText( Content );
else
mbp.setContent( Content, Content );
(下面的俺没用过。。。。。)
解码
javamail包中的MimeUtility工具中也提供了对邮件信息解码的方法,都是以decode开头的一些方法(如decodeText)
例子:
String Subject = mimemsg.getSubject();
String ChSubject = MimeUtility.decodeText(Subject);
对于base64和QP编码后信息,decode* 方法能将他们正确的解码,但是,如果指定的字符集不对,那么javamail就会出现错误,不能正确地将
其解码。
如有的邮件系统将”txt测试”编码后如下:
=?x-unkown?Q?Txt=B2=E2=CA=D4
这里指定的字符集是x-unknown,是非明确的字符集,javamail就不能正确的处理了,但是”测试”这两个中文字还是按照gbk字符集编码的,
所以你可以手工的将编码方式信息改正确,再用decode*方法来解码。
例子:
if ( str.indexOf("=?x-unknown?") >=0 ){
str = str.replaceAll("x-unknown","gbk" ); // 将编码方式的信息由x-unkown改为gbk
try{
str = MimeUtility.decodeText( str ); //再重新解码
}catch( Exception e1){
return str ;
}
decode*方法都是根据在编码信息中包含的编码方式的信息来解码,所以decode*方法对邮件正文解码是无效的,因为邮件正文中不包含编码方
式的信息。
同编码一样,邮件正文的解码也是由javamail做了。Javamail根据Content-Transfer-Encoding里的信息,来对邮件的正文解码。
客户程序从javamail取得的正文内容字符集为iso-8859-1,所以还要将字符集转换一下,例:
String CorrectContent = new String( Content.getbytes(“iso-8859-1”),”gb2312”);
CorrentContent为正确的邮件正文了
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/DR_LF/archive/2010/11/17/6014818.aspx
摘抄做笔记!!嘿嘿
分享到:
相关推荐
导入到Myeclipse 即可运行 测试使用的是QQ邮箱 在application.xml中配置的发送邮箱 要到邮箱中设置 POP3/SMTP服务为开。项目不部署到tomcat后启动服务,然后运行test.java 就发送了,。绝对可以发送
Spring整合JavaMail发送qq邮件,极简单的例子。看完就会。。。
Spring Use JavaMail SendEmail(spring使用javamail发送邮件的例子)
javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码 查看debug 邮件处理过程发现邮件头没有编译, 内容是base64编码,所以邮箱收不到或者收到的是base64编码后的一堆乱码,
javamail发送邮件实例 javamail 发送邮件 文本编辑器 kindeditor
在spring利用javamail,quartz定时发送邮件
此源码是使用javamail发送邮件,可以实现静默发送邮件,可以发送附件资源等。有相应的使用说明,快捷好用
NULL 博文链接:https://lihongtai.iteye.com/blog/2178787
javamail问题及解决方案源码
javaMail
该资源是一个javamail发送邮件的例子,里面集成了别人的文件发送的功能,单次发送邮件只能上传一个附件。是一个测试方法,拿过来改一改邮件的地址和密码就可以使用了
javamail中文API文档 方法解释详细。
Struts2框架,javamail发送邮件,可以直接用main()调用,也可通过tomcat,在IE上运行,比较简单易懂。
Spring框架整合Quartz,使用javamail定时发送邮件
页面使用ajax上传文件,Java端采用file.Transto 来保存上传的文件,支持发送正文文本,图片,附件;图片作为附件发送,如需求图片糅合在正文文本中,只需在代码中稍加改动,有注释。
JavaMail组件简单应用,比较适合刚接触JavaMail组件的初学者。
Javamail发送邮件类库,Java发送邮件需要用到该类库
本资源是一个集合发送图片,附件,内容,HTML等得JAVAMAIL代码,并且可以同时发送多个附件多个图片,只需填充VO类,即可直接调用并发送邮件,例子已经写好,只要填充上必要值即可,经163,qq,sina测试没有问题,有...
JSP与JavaMail发送HTML格式... java,javamail发送html邮件..
javamail发送邮件的简单实例