首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
WapWeb (12)
yjz0065 (119)
wangchinaking (66)
Mailbomb (102)
iiprogram (87)
tingya (30)
smallnest (66)
nizhigang2000 (12)
star33375249 (2)
longrujun (66)
CSDN - 文档中心 - Java 阅读:4635   评论: 2    参与评论
标题   使用java mail 包收发中文邮件的编码,解码问题以及解决方法     选择自 hong1deng1dao 的 Blog
关键字   使用java mail 包收发中文邮件的编码,解码问题以及解决方法
出处  
  1. 编码

 

邮件头(参见RFC822RFC2047)只能包含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方式编码,一种是QPquoted-printable)方式编码,javamail根据具体情况来选择编码方式。

 

如“txt测试”编码后内容如下:

=?GBK?Q?Txt=B2=E2=CA=D4

               

里面有个=?GBK?Q?GBK表示的是内容的字符集,?Q?表示的是以QP方式编码的,后面紧跟的才是编码后的中文字符。所以用MimeUtility工具编码后的信息里包含了编码方式的信息。

 

邮件的正文也要进行编码,但它不能用MimeUtility里的方法来编码。邮件正文的编码方式的信息是要放在Content-Transfer-Encoding这个邮件头参数中的,而MimeUtility里面的方法是将编码方式的信息放在编码后的正文内容中。所以如果你对正文也用MimeUtility进行处理,那么其他邮件程序就不会正常显示你编码的邮件,因为其他邮件软件如outlook,foxmail只会根据Content-Transfer-Encoding这个里面的信息来对邮件正文进行解码。

 

其实,邮件正文部分的编码javamail已经自动帮你做了,当你发送邮件的时候,它会自己决定编码方式,并把编码方式的信息放入Content-Transfer-Encoding这个邮件头参数中,然后再发送。所以你所要做的就是直接把邮件正文的内容放入邮件中就可以了。

 

对邮件正文的编码方式比较多,包括了base64QP方式,还有一些如7bit,8bit等等,因为javamail自动为邮件正文编码,所以我就不一一祥叙了。

 

例子:

 

  //处理邮件正文

MimeBodyPart mbp=new MimeBodyPart();

                

if ( ContentType() == null || ContentType.equals(""))

  mbp.setText( Content );

else

                 mbp.setContent( Content, Content );

 

                               

 

 

 

  1. 解码

 

javamail包中的MimeUtility工具中也提供了对邮件信息解码的方法,都是以decode开头的一些方法(decodeText)

 

例子:

                String Subject = mimemsg.getSubject();

                String ChSubject = MimeUtility.decodeText(Subject);

 

对于base64QP编码后信息,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 网友 ( 2005-10-26)
按上面的方法没根本解决问题。
CSDN 网友 ( 2005-06-27)
MimeBodyPart mbp=new MimeBodyPart();
if ( ContentType() == null || ContentType.equals(""))
  mbp.setText( Content );
else
                 mbp.setContent( Content, Content );
这段code有问题:至少mbp.setContent( Content, Content );这句我觉得应该是mbp.setContent( Content, ContentType );
if ( ContentType() == null || ContentType.equals(""))这句应该是String contentType= mbp.getContentType();
if ( contentType == null || contentType.equals(""))