`

javamail乱码问题【转】

阅读更多

所谓众口难调,但我相信总有一款适合你

1,在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下:

   sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
   msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");

2,((MimeMessage)message).setSubject(subject, "GBK");

3,message.setSubject(new String(ttitle.getBytes("GB2312"),"ISO8859-1"));

4,mailsubject = MimeUtility.encodeText(new String(mailsubject.getBytes(), "GB2312"), "GB2312", "B");

========================================================================

 

解决内容乱码可以这样:
         //设置邮件文字内容部分
         MimeBodyPart textBodyPart = new MimeBodyPart();
         //这里转换文字内容到gb2312格式。
             textBodyPart.setContent(content, "text/html;charset=\"GB2312\"");
             //设置邮件附件加载器
             MimeBodyPart fileBodyPart = new MimeBodyPart();
             javax.activation.FileDataSource fds = new FileDataSource(path);
             //要发送的附件
         Multipart container = new MimeMultipart();
             File f = new File(path);
             if (f.exists())
             {
                 fileBodyPart.setDataHandler(new DataHandler(fds));
                 fileBodyPart.setFileName("=?GBK?B?" +
                                         enc.encode( (fds.getName()).getBytes()) +
                                         "?=");//这里解决了附件名乱码问题
                 container.addBodyPart(fileBodyPart);//加载附件到邮件容器
             }
             container.addBodyPart(textBodyPart);
             message.setContent(container);//加载容器到消息类

其中的enc实例我是这样定义的:
             Base64Converter enc = new Base64Converter();
这里面的Base64Converter类自己可以编写,如下:
public class Base64Converter
{

     public static final char[] alphabet = {
         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7
         'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 8 to 15
         'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 16 to 23
         'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', // 24 to 31
         'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 32 to 39
         'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 40 to 47
         'w', 'x', 'y', 'z', '0', '1', '2', '3', // 48 to 55
         '4', '5', '6', '7', '8', '9', '+', '/'}; // 56 to 63

     public static String encode(String s)
     {
         return encode(s.getBytes());
     }

     public static String encode(byte[] octetString)
     {
         int bits24;
         int bits6;

         char[] out
             = new char[ ( (octetString.length - 1) / 3 + 1) * 4];

         int outIndex = 0;
         int i = 0;

         while ( (i + 3) <= octetString.length)
         {
             bits24 = (octetString[i++] & 0xFF) << 16;
             bits24 |= (octetString[i++] & 0xFF) << 8;
             bits24 |= (octetString[i++] & 0xFF) << 0;

             bits6 = (bits24 & 0x00FC0000) >> 18;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x0003F000) >> 12;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x00000FC0) >> 6;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x0000003F);
             out[outIndex++] = alphabet[bits6];
         }

         if (octetString.length - i == 2)
       {
             bits24 = (octetString[i] & 0xFF) << 16;
             bits24 |= (octetString[i + 1] & 0xFF) << 8;

             bits6 = (bits24 & 0x00FC0000) >> 18;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x0003F000) >> 12;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x00000FC0) >> 6;
             out[outIndex++] = alphabet[bits6];
             out[outIndex++] = '=';
         }
         else if (octetString.length - i == 1)
       {
             bits24 = (octetString[i] & 0xFF) << 16;

             bits6 = (bits24 & 0x00FC0000) >> 18;
             out[outIndex++] = alphabet[bits6];
             bits6 = (bits24 & 0x0003F000) >> 12;
             out[outIndex++] = alphabet[bits6];
             out[outIndex++] = '=';
             out[outIndex++] = '=';
         }

         return new String(out);
     }
}

 

分享到:
评论

相关推荐

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

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

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

    在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将详细探讨这些问题的原因及相应的解决方案。 ##...

    javamail发送邮件 主题乱码解决

    第90行,setSubject("")

    javamail 邮件系统

    在创建`MimeMessage`或`MimeBodyPart`时,需设置适当的字符集,以避免乱码问题。 4. **添加附件**: 如果需要发送带有附件的邮件,可以使用`MimeBodyPart`类创建一个新的部分,设置其数据源(如文件路径),然后将...

    JavaMail开发原理简介PPT

    邮件开发过程中会遇到一些常见问题,比如中文附件的乱码问题、Tomcat中JavaMail的支持与冲突,以及如何实现有效的邮件群发。这些问题需要开发者深入理解邮件协议和JavaMail的使用方式来解决。 邮件服务的核心是邮件...

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

    JavaMail API提供了相应的设置,可以避免乱码问题。 5. **发送邮件**:最后,通过`Transport.send()`方法将邮件消息发送出去。在此过程中,JavaMail会与SMTP服务器建立连接,验证身份(如果需要),并传输邮件。 ...

    Javamail开发

    在实际开发中,还会遇到一些常见问题,如中文附件的乱码问题、Tomcat中JavaMail的兼容性和冲突问题,以及如何高效地实现邮件群发。 邮件开发涉及的基本概念包括邮件服务器和电子邮箱。邮件服务器扮演着类似现实生活...

    简单的javamail例子 (源码)

    - **字符集问题**:确保所有涉及到字符集的地方都正确设置了编码,避免乱码问题。 - **邮件服务器配置**:根据实际使用的邮件服务商来正确配置邮件服务器地址和其他相关属性。 - **安全问题**:在生产环境中使用 ...

    javamail发送html邮件

    2. **字符编码问题**:HTML 内容的编码需要与邮件的编码一致,以避免乱码问题。 3. **安全性考虑**:不要在代码中硬编码用户名和密码,建议使用环境变量或其他安全的方式进行存储。 综上所述,使用 JavaMail 发送 ...

    javaMail.zip

    - 邮件格式问题,比如正文编码不正确导致乱码,或者附件无法正常打开。 - 安全性问题,如需要确保邮件传输过程的安全,可能需要使用SSL/TLS加密。 为了便于开发者使用,JavaMail 提供了多个版本,每个版本可能会...

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

    在设置邮件主题或正文时,必须确保使用正确的字符编码(如UTF-8),并使用MimeUtility的encodeText方法对特殊字符进行编码,以避免乱码问题。 5. **异常处理**: 在发送邮件过程中,可能会遇到网络问题、服务器拒绝...

    javamail资料

    - 遵循邮件编码规则,尤其是处理非 ASCII 字符时,以防止乱码问题。 - 如果可能,使用 SMTP 服务器的 STARTTLS 或者 SSL/TLS 加密选项。 JavaMail 是 Java 开发者处理电子邮件的强大工具,无论是在企业级应用还是...

    文件下载response.setHeader()下载中文文件名乱码问题解决办法.pdf

    对于中文文件名,如果直接使用getBytes()进行编码,可能会导致乱码,因此推荐使用`MimeUtility.encodeWord()`方法,这是一个在JavaMail库中的方法,它遵循RFC2047规范,能正确处理非ASCII字符,例如: ```java ...

    JavaMail结合JSP实现中文邮件收发系统.rar

    在处理中文字符时,JavaMail API支持MIME(多用途互联网邮件扩展)编码,确保非ASCII字符(如中文)在传输过程中不会出现乱码问题。 JSP是Java的一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现...

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

    在实现过程中,可能会遇到中文乱码问题。为了避免这种情况,需要确保正确设置字符编码。例如,设置MimeMessage的编码为UTF-8:`message.setEncoding("UTF-8")`,并在创建MimeBodyPart时指定相应编码。 此外,...

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

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

    JavaMail组件开发

    3. 附件问题:使用MIME技术处理附件,确保编码正确,避免乱码。 六、应用场景 JavaMail组件广泛应用于企业级应用中,如自动发送通知邮件、用户注册验证、系统日志记录、文件传输等场景。 总之,JavaMail组件是Java...

    Java自带的Java-mail框架 163 邮件发送,支持多附件,没中文乱码

    在本案例中,我们将关注如何使用JavaMail发送带有多个附件且不出现中文乱码的邮件,特别是通过163邮箱服务提供商。 1. **JavaMail API基础**: JavaMail API提供了一系列的类和接口,如`Session`,`Message`,`...

    JavaMail 发送邮件

    - **编码问题**:处理好邮件中的特殊字符和非 ASCII 字符,防止乱码。 通过 JavaMail,开发者可以轻松地在 Java 应用中集成邮件功能,无论是简单的文本邮件还是复杂的多部分邮件,都可以轻松应对。在实际应用中,...

Global site tag (gtag.js) - Google Analytics