`
han2000lei
  • 浏览: 272935 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JavaMail的编码问题

    博客分类:
  • java
SUN 
阅读更多
在使用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中碰到的中文乱码问题就这么多了,如果你的程序出现了中文乱码,首先不要惊慌,可用多个其他的邮件发送或接收程序进行验证,看是在哪个环节出现了问题,然后再仔细对照原文和乱码,调用相应的编码解码方法就行了。

最后,希望这篇短文能对你有所启发,祝你成功。 
分享到:
评论

相关推荐

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

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

    javamail 上传附件中文乱码修改(附修改之后的mail.jar和反编译工具)

    NULL 博文链接:https://instance.iteye.com/blog/577172

    使用javamail包收发中文邮件的编码,解码问题以及解决方法.pdf

    使用javamail包收发中文邮件的编码,解码问题以及解决方法.pdf

    使用javamail包收发中文邮件的编码,解码问题以及解决方法扫描.pdf

    使用javamail包收发中文邮件的编码,解码问题以及解决方法扫描.pdf

    javamail发送邮件 主题乱码解决

    第90行,setSubject("")

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

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

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

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

    code_java.rar_base64_chosehhs_javamail_下载_表单

    javaweb中文件的上传和下载,BASE64编码的实现,以及javamail的具体应用。提供了完整的源码和实现,希望对大家有所帮助。

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

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

    JAVAWeb全课程笔记( html版)

    [总结]JavaWeb乱码问题 [转自IBM]中文编码问题 JDBC入门 Jdbc事务控制管理 常用数据库连接池 编写JDBC框架 客户信息管理系统 Servlet Filter 过滤器 HTTP 协议 文件上传和下载 Servlet事件监听器 JavaMail开发 ...

    Android邮件客户端Demo

    一个完整的邮件客户端,使用javamail框架 可选自动登录,使用pop3和stmp协议收发邮件,支持多附件收发。 邮件内容解析支持多种编码,html内容自动用webview显示。

    JSP所有问题整合

    其中包括上传下载、数据库的操作、应用服务器使用、乱码问题、变量传递与获得、语法于技巧、Servlet、JavaBean、中文编码、经典算法、图形处理、JavaMail、XML等许多CSDN曾经有过的问题整合·

    Java学习笔记

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

    base64编码器

    用telnet发邮件时,要用到base64编码,写了一个程序,可以运行生成编码,可是每次都要在eclipse上编译,运行,很麻烦,于是写了一个base64编码小工具,我已经打包成可运行的jar包,双击就可打开使用。

    Jmail结合JSP实现邮件的收发

    JavaMail 的推出使得用 Java 开发邮件系统变得非常容易,但是要想正确...另外在处理中文Mail 时,还会遇到 Java 中的字符集转换以及 Mail 中的编码问题。本文重点介绍了 MIME 协议规定的邮件格式标准及数据的编码问题。

    CSDN.rar_简繁体_股票 java

    Java 程序编码规范 利用Java实现zip压缩/解压缩 Java语言的Socket编程 利用Java实现串口全双工通讯 Java语言中字符的处理 区分引用类型和原始类型 Java中的两个特殊变量this和super Java中利用散列表实现股票行情...

    传智播客黑马35期

    day24_在线支付&JavaMail; day25_编码实战day01 day26_编码实战day02 day27_编码实战day02 day28_struts2基础 day29_struts2加强 day30_struts2拦截器&ognl;表达式 day31_struts2数据验证&常用标签 day32_...

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

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

    spring整合freemarker发送邮件例子

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

Global site tag (gtag.js) - Google Analytics