`
wlhok
  • 浏览: 56883 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JavaMail邮件别名和主题乱码解决[转]

    博客分类:
  • Java
阅读更多
 

编码<o:p></o:p>

邮件头<o:p></o:p>

邮件头(参见RFC822RFC2047)只能包含US-ASCII字符。邮件头中任何包含非US-ASCII字符的部分必须进行编码,使其只包含US-ASCII字符。所以使用java mail发送中文邮件必须经过编码,否则别人收到你的邮件只能是乱码一堆。不过使用java mail 包的解决方法很简单,用它自带的MimeUtility工具中encode开头的方法(如encodeText)对中文信息进行编码就可以了。

<o:p> </o:p>         例子:

         MimeMessage mimeMsg = new MimeMessage(mailSession);

// javamail决定用什么方式来编码 ,编码内容的字符集是系统字符集

mimeMsg.setSubject( MimeUtility.encodeText( Subject) );

// 使用指定的base64方式编码,并指定编码内容的字符集是gb2312

mimeMsg.setSubject( MimeUtility.encodeText( Subject,”gb2312”,”B”)); //Bbase64方式

<o:p></o:p>

        

通常对邮件头的编码方式有2,一种是base64方式编码,一种是QPquoted-printable)方式编码,javamail根据具体情况来选择编码方式。

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

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

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

<o:p> </o:p>

邮件正文<o:p></o:p>

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

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

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

<o:p></o:p>

例子:

// 处理邮件正文

MimeBodyPart mbp=new MimeBodyPart();

if ( ContentType == null || ContentType.equals("")) // ContentType为编码类型,如GBK

mbp.setText( Content ); // JavaMail来决定编码

else

mbp.setContent( Content, ContentType); // 指定编码格式

解码<o:p></o:p>

邮件头<o:p></o:p>

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

<o:p> </o:p>

例子:

String Subject = mimemsg.getSubject();

String ChSubject = MimeUtility.decodeText(Subject);

<o:p> </o:p>

对于base64QP编码后信息,decode* 方法能将他们正确的解码,但是,如果指定的字符集不对,那么javamail就会出现错误,不能正确地将其解码。

如有的邮件系统将”txt测试”编码后如下:

=?x-unkown?Q?Txt=B2=E2=CA=D4

这里指定的字符集是x-unknown,是非明确的字符集,javamail就不能正确的处理了,但是”测试”这两个中文字还是按照gbk字符集编码的,所以你可以手工的将编码方式信息改正确,再用decode*方法来解码。

<o:p>         </o:p>例子:

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 ;

}

         }

<o:p> </o:p>

         邮件正文<o:p></o:p>

decode*方法都是根据在编码信息中包含的编码方式的信息来解码,所以decode*方法对邮件正文解码是无效的,因为邮件正文中不包含编码方式的信息。

同编码一样,邮件正文的解码也是由javamail做了。Javamail根据Content-Transfer-Encoding里的信息,来对邮件的正文解码。

客户程序从javamail取得的正文内容字符集为iso-8859-1,所以还要将字符集转换一下。

例子:

String CorrectContent = new String( Content.getbytes(“iso-8859-1”),”gb2312”);

CorrentContent为正确的邮件正文了

分享到:
评论
2 楼 hjg1988 2011-10-07  
主题似乎这样就可以了:
mimeMsg.setSubject(subject, "UTF-8");
1 楼 tsw126 2008-07-23  
  

相关推荐

    javamail发送邮件 主题乱码解决

    第90行,setSubject("")

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

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未...同时,利用调试工具深入理解邮件发送的具体流程也有助于快速定位和解决问题。

    使用JAVAMail代发邮件

    这个类称为 MailInfo,包含了邮件的各种信息,例如邮件服务器的主机名和端口号、邮件发送者的地址、邮件接收者的地址、邮件主题、邮件内容、邮件附件等。 在 MailInfo 类中,我们定义了多个成员变量,用于存储邮件...

    基于Javamail的邮件收发系统.zip

    基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件收发系统.zip基于Javamail的邮件...

    JavaMail邮件收发实例_JavaMail_API

    JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API

    javamail邮件管理系统

    JavaMail邮件管理系统是一款基于Java技术实现的邮件服务应用程序,它利用SMTP(Simple Mail Transfer Protocol)协议来发送邮件,以及IMAP(Internet Message Access Protocol)协议来接收和管理邮件。这两个协议是...

    常规JavaMail 邮件发送实用类

    1. `sendEmail(String from, String to, String subject, String body)`: 这个方法用于发送简单的文本邮件,参数分别为发件人、收件人、邮件主题和邮件正文。 2. `sendHtmlEmail(String from, String to, String ...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    javamail收发邮件加密和不加密

    JavaMail 是一个强大的开源库,用于在Java应用程序中处理电子邮件。它支持多种协议,包括POP3、IMAP和SMTP,这些协议分别用于接收、检索和发送邮件。在使用JavaMail时,了解如何进行加密和非加密通信对于确保数据...

    基于JavaMail邮件系统的设计与实现 论文

    JavaMail API是一个开源的、跨平台的库,它提供了与各种邮件服务器通信的能力,支持SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP(因特网消息访问协议)等多种邮件协议。 首先,让我们深入了解一下相关...

    javamail邮件群发、单发_邮件发送

    JavaMail 是一个强大的开源库,用于在 Java 应用程序中处理电子邮件的发送和接收。它提供了丰富的 API,使得开发者可以方便地实现邮件的发送、接收、管理等操作。在这个主题中,我们将深入探讨如何使用 JavaMail ...

    javamail 回执邮件资料

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...

    JavaMail邮件发送源码 非常简单

    JavaMail是一种在Java应用程序中发送和接收电子邮件的标准API,它为开发者提供了强大的功能,使得处理邮件变得简单而高效。在JavaMail中,我们主要利用 javax.mail 和 javax.mail.internet 这两个包中的类来实现邮件...

    javamail邮件系统开发

    JavaMail邮件系统开发是Java开发者在构建应用程序时用于发送和接收电子邮件的重要工具。它是一个开源的API,提供了丰富的功能,让开发者能够轻松地与各种邮件服务器进行交互。在这个主题中,我们将深入探讨JavaMail...

    james和javamail实现邮件收发(带发送附件)

    首先,James(Apache James)是一个开源的邮件服务器,它支持SMTP、POP3和IMAP协议,可以作为企业级的邮件解决方案。James的核心特性之一是其可扩展性,可以通过插件连接到各种数据库,以便存储和管理邮件数据。 ...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    JavaMail邮件的上传和下载

    JavaMail是一种在Java环境下处理电子邮件的强大工具,它提供了丰富的API,允许开发者发送、接收和管理邮件。这个压缩包文件中的"16_sendmail"可能包含了用于演示如何使用JavaMail发送邮件的源代码。 JavaMail的核心...

    JavaMail 具备垃圾邮件过滤功能的邮箱

    总的来说,这个JavaMail邮箱系统是一个集成了邮件处理、用户设置和智能过滤的综合平台,通过利用JavaMail库和朴素贝叶斯算法,提供了一种高效且用户友好的邮件管理方案。开发者在设计时考虑到了用户体验和安全,使其...

    JavaMail邮件开发详解

    2. **创建Message对象**:使用 Session 对象创建 Message 对象,并设置邮件的主题、内容和收件人等。 3. **发送邮件**:使用 Transport 类的 send 方法发送邮件。 **代码示例**(伪代码形式): ```java // 导入...

Global site tag (gtag.js) - Google Analytics