在使用javamail api开发邮件服务系统时,我们常常会碰到很多中文乱码问题,下面就分别介绍如何解决这些问题。
先介绍一下javamail的编码:
1、内容编码:
当一段 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 更短。
2、标题编码:
邮件的标题,用了一种更简短的格式来标注“字符编码”和“传输编码”。比如,标题内容为 "中",则在邮件源代码中表示为:
// 正确的标题格式
Subject: =?GB2312?B?1tA=?= //subject是指标题内容
其中,
第一个“=?”与“?”中间的部分指定了字符编码,在这个例子中指定的是 GB2312。
“?”与“?”中间的“B”代表 Base64。如果是“Q”则代表 Quoted-Printable。
最后“?”与“?=”之间的部分,就是经过 GB2312 转化成字节串,再经过Base64 转化后的标题内容。
如果“传输编码”改为 Quoted-Printable,同样,如果标题内容为 "中":
// 正确的标题格式
Subject: =?GB2312?Q?=D6=D0?=
如果阅读邮件时出现乱码,一般是因为“字符编码”或“传输编码”指定有误,或者是没有指定。比如,有的发邮件组件在发送邮件时,标题 "中":
// 错误的标题格式
Subject: =?ISO-8859-1?Q?=D6=D0?=
这样的表示,实际上是明确指明了标题为 [0x00D6, 0x00D0],即 "ÖÐ",而不是 "中"。
解决乱码方法:
1.邮件主题乱码或附件名乱码
解决办法:
在调用setSubject()设置主题时使用Base64编码。例如:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//mailMessage是一个javax.mail.Message,而mailInfo是我们自己写的一个类,作用是存放邮件信息。mailInfo.getSubject()是MailInfo类中的方法,目的是获取邮件的主题。
mailMessage.setSubject("=?utf8?B?"+enc.encode(mailInfo.getSubject().getBytes())+"?=");
2.接收邮件时,获取某些邮件发送程序发送的email地址,发送地址显示为乱码
解决办法:
对含有中文的发送地址,使用MimeUtility.decodeTex方法,对其他则把地址从ISO8859_1编码转换成gbk编码,见下例
public static String getFrom(Message msg){
String from="";
try{
if(msg.getFrom()[0]!=null)
from=msg.getFrom()[0].toString();
if(from.startsWith("=?GB")||from.startWith(“=?gb”)){
from=MimeUtility.decodeText(from);
}else{
from=StringUtil.toChinese(from);
}
}catch(Exception e){
e.printStackTrace();
}
from=StringUtil.replaceStr(from,“<”,“<”);// replaceStr为字符串替换函数
from=StringUtil.replaceStr(from,">",">");
return from;
}
///////////////////StringUtil的toChinese方法//////////////////////////
public static String toChinese(String strvalue){
try{
if(strvalue==null)
return null;
else{
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
3.接收邮件时,获取某个邮件的中文附件名,出现乱码
解决办法:
对于用base64编码过的中文,则采用base64解码,否则对附件名进行ISO8859_1到gbk的编码转换,例如:
String temp=part.getFileName();//part为Part实例
if((temp.startsWith("=?GBK?B?")&&temp.endsWith("?="))
||(temp.startsWith("=?gbk?b?")&&temp.endsWith("?="))){
temp=StringUtil.getFromBASE64(temp.substring(8,temp.indexOf("?=")-1));
}else{
temp=StringUtil.toChinese(temp);//该方法如前所叙
}
/////////////StringUtil的getFromBASE64方法/////////
public static String getFromBASE64(String s) {
if (s == null) return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
乱码问题的调试步骤总结:
基本上在javamail中碰到的中文乱码问题就这么多了,如果你的程序出现了中文乱码,首先不要惊慌,可用多个其他的邮件发送或接收程序进行验证,看是在哪个环节出现了问题,然后再仔细对照原文和乱码,调用相应的编码解码方法就行了。
最后,希望这篇短文能对你有所启发,祝你成功。
分享到:
- 2009-03-25 16:17
- 浏览 1944
- 评论(0)
- 论坛回复 / 浏览 (0 / 4842)
- 查看更多
相关推荐
### JavaMail问题及解决方案 JavaMail是Java平台中用于发送和接收邮件的API,它提供了对各种邮件协议的支持,如SMTP、POP3和IMAP。然而,在实际应用中,JavaMail经常会遇到各种问题,比如连接失败、身份验证错误等...
JavaMail API的Y2K兼容性意味着它能够正确处理跨世纪的日期问题。 安装和配置JavaMail API时,需将其JAR文件添加到项目或服务器的CLASSPATH中,并根据所使用的邮件服务器配置相应的主机名、用户名和密码。如果需要...
在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...
此外,需要注意的是,随着技术的发展,JavaMail也推出了更新的版本,如`javamail-1.6.x`,这些新版本可能包含更多的特性、修复了已知问题并提升了性能。对于新项目,建议使用最新稳定版本的JavaMail以获得最佳支持和...
在JavaMail 1.4.7 版本中,这个库提供了全面的电子邮件处理功能,包括附件、HTML 内容、MIME 编码以及对认证和加密的支持。 JavaMail 的核心组件包括 `javax.mail` 和 `javax.mail.internet` 包,它们包含了创建、...
JavaMail 是一个开源的 Java API,它允许开发者在 Java 应用程序中发送和接收电子邮件。这个【标题】"JavaMail所需最新版(1.5.4)jar包"指的...记住,始终确保使用与JavaMail API相匹配的JAF版本,以避免兼容性问题。
使用 JavaMail 包收发中文邮件的编码、解码问题以及解决方法 使用 JavaMail 包收发中文邮件时,需要考虑编码和解码的问题。在发送中文邮件时,邮件头需要进行编码,使其只包含 US-ASCII 字符。 JavaMail 包提供了 ...
9. **国际化和本地化**:JavaMail 支持多种语言,包括邮件头的编码和解码,以及用户界面的本地化。 通过分析JavaMail 1.4.3的源码,开发者可以学习如何正确处理邮件的生命周期,理解邮件协议的工作原理,以及如何在...
JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个“javamail发送邮件.zip”压缩包显然包含了一个示例项目,演示如何使用JavaMail API发送包含正文文本、图片以及附件的邮件。以下是对这...
JavaMail 还支持 HTML 邮件、MIME 编码、邮件会话跟踪、邮件过滤、邮件搜索等功能,以及 SSL/TLS 加密连接,以确保通信安全。 总的来说,JavaMail 是 Java 平台上实现邮件功能的强大工具,它通过简单的 API 允许...
- 处理邮件时要注意字符编码问题,确保正确显示非ASCII字符。 以上就是JavaMail实例中涉及的主要知识点。通过学习和实践,开发者可以灵活地在Java应用程序中集成邮件功能,满足各种业务需求。在提供的链接中,可以...
源码分析有助于开发者了解 JavaMail 内部的工作机制,例如邮件编码处理、SMTP 协议实现、MIME 处理等。通过查看源码,你可以学习到如何处理异常、优化性能,以及如何适配不同邮件服务器的特性。 **标签 "javamail ...
使用 JavaMail 包收发中文邮件的编码、解码问题以及解决方法 JavaMail 是一个流行的 Java API,用于发送和接收电子邮件。然而,在使用 JavaMail 发送中文邮件时,可能会遇到编码和解码问题。本文将详细介绍使用 ...
在创建`MimeMessage`或`MimeBodyPart`时,需设置适当的字符集,以避免乱码问题。 4. **添加附件**: 如果需要发送带有附件的邮件,可以使用`MimeBodyPart`类创建一个新的部分,设置其数据源(如文件路径),然后将...
9. **国际化支持**:JavaMail 支持多语言环境,包括邮件内容的编码和字符集转换。 10. **可扩展性**:JavaMail 提供了插件式架构,允许开发者添加自定义的协议处理器和内容类型处理器。 在阅读JavaMail源码时,你...
在实际开发中,你可能需要处理更多复杂情况,如处理 MIME 复杂结构、解析 HTML 内容、处理编码问题、处理不同邮件服务器的差异等。以上内容只是基础,真正使用 JavaMail 开发邮件应用时,还需要结合具体需求进行深入...
在实际应用中,敏感信息如SMTP凭据不应该直接硬编码在JSP或源代码中,而是应该存储在安全的位置(如应用的配置文件或数据库),并在运行时动态加载。 8. 文件附件: 如果需要发送带有附件的邮件,JavaMail API...
这个项目不仅提供了SMTP、POP3和IMAP协议的支持,还包含了丰富的API,可以方便地处理邮件的MIME编码、附件、HTML内容等复杂格式。在描述中提到的“具备垃圾邮件过滤功能的邮箱”是一个基于JavaMail实现的邮件系统,...
在JavaMail 2.0源码中,你可以看到这些类的实现细节,包括如何建立与邮件服务器的连接、解析邮件头、编码和解码邮件内容、处理SSL/TLS安全连接等。源码还可能包含了错误处理和异常类,帮助开发者更好地理解和解决...
12. **国际化与本地化**:JavaMail支持多语言环境,可以处理不同编码的邮件内容。 通过学习和使用JavaMail库,开发者可以轻松地在Java应用中实现邮件功能,无论是简单的文本邮件还是复杂的带有附件和格式的多媒体...