最近在弄javamail发送邮件当邮件里含有附件并且附件是中文的时候发送后就会出现乱码!!

通过javax.mail.internet.MimeUtility.encodeText()就可解决这个附件乱码的问题

直接和发送邮件的代码一起奉上:

package Demo;

import Java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class SendEmail {

/**
* @param args
*/
public  static final String  user = "";//发送邮件邮箱
public  static final String  pwd  = "";//发送邮件邮箱密码
public  static final String  smtp = "smtp.163.com";//简单邮件传输协议

public static void main(String[] args) {
List<String> recipients = new ArrayList<String>();//收件人列表
String recipient = "";//收件人邮箱
recipients.add(recipient);
List<File> FileList = new ArrayList<File>();//附件列表
File file = new File("D:\\附件.xls");
FileList.add(file);
String title = "邮件主题";
String username = "发送邮件人";
String text = "邮件文本";
try{
Properties props = System.getProperties();
props.put("mail.smtp.host", smtp);//这里默认使用163邮箱
Session session = null;

if (user != null && pwd != null) {
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.user", user);
props.put("mail.smtp.password", pwd);

} else {
props.put("mail.smtp.auth", "false");
}
session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, pwd);
}
});

MimeMessage message = new MimeMessage(session);
if (false) {//是否需要收条
message.addHeader("Disposition-Notification-To","接收收条地址");
}
message.setSubject(title);//
message.setFrom(new InternetAddress(user, username));

int receiverCount = recipients.size();
       if (receiverCount > 0) {
        InternetAddress[] address = new InternetAddress[receiverCount];
        for (int i = 0; i < receiverCount; i++) {
         address[i] = new InternetAddress((String) recipients.get(i));
        }          
        message.addRecipients(Message.RecipientType.TO, address);
       }
       
          
MimeMultipart multi = new MimeMultipart();
BodyPart textBodyPart = new MimeBodyPart();

textBodyPart.setText(text);

multi.addBodyPart(textBodyPart);
if (FileList != null) {
for (int i = 0; i < FileList.size(); i++) {
File f = (File) FileList.get(i);
FileDataSource fds = new FileDataSource(f);
BodyPart fileBodyPart = new MimeBodyPart();
fileBodyPart.setDataHandler(new DataHandler(fds));
fileBodyPart.setFileName(MimeUtility.encodeText(f.getName()));//如果附件有中文通过转换没有问题了
multi.addBodyPart(fileBodyPart);
}
}
message.setContent(multi);
message.setSentDate(new Date());

Transport.send(message);
System.out.println("发送成功!");
}catch(Exception e){
e.printStackTrace();
}

}

}

补充:测试的时候发现有的时候中文名过长MimeUtility.encodeText方法会自动给添加下划线通过查找得知:对文件进行编码时超出长度会自动通过"/r","/n"替换而MimeUtility.encodeText可能通过"_"进行连接只要替换了"/r","/n"即可所以那段代码应该这样写:

String filename = MimeUtility.encodeText(f.getName());
filename = filename.replaceAll("\r", "").replaceAll("\n", "");
fileBodyPart.setFileName(filename);

 

Javamail 发送附件中文名过长以及乱码问题的更多相关文章

  1. (三)JavaMail发送附件

    代码如下: package cases; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHand ...

  2. javamail 发送附件

    1.属性文件 mail.protocol=smtpmail.host=mail.port=mail.auth=truemail.timeout=25000mail.username=mail.pass ...

  3. 使用JavaMail发送带附件的邮件

    所需jar包 链接:http://pan.baidu.com/s/1dFo4cDz 密码:akap 工具类: package com.javamail.utils; import java.util. ...

  4. 【Mail】JavaMail发送带附件的邮件(二)

    上一篇讲了使用JavaMail发送普通邮件([Mail]JavaMail介绍及发送邮件(一)),本例讲发送复杂的邮件(带有附件的邮件) 生成一封复杂的邮件 新建一个JavaWeb的Maven工程,引入 ...

  5. 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...

  6. (转)用javamail发送带附件的邮件

    本文转载自:http://redleaf.iteye.com/blog/78217 mail.java 代码 package mail; import java.util.* ; import jav ...

  7. JavaMail发送和接收邮件API(详解)

    一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMa ...

  8. [Java] JavaMail 发送带图片的 html 格式的邮件

    JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...

  9. JavaMail发送和接收邮件

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

随机推荐

  1. TCP应用程序通信协议的处理

    TCP应用程序通信协议的处理 flyfish 2015-6-29 一 流式处理 TCP是一种流协议(stream protocol).TCP数据是以字节流的形式传递给接收者的,没有固有的"报 ...

  2. JDBC技术总结(二)

    上一节主要讲了JDBC的基本操作,这一节主要总结一下JDBC如何处理大文本.如何处理图片以及进行批处理. 1.JDBC处理大文本 在MySQL中,大文本是text类型,使用Java操作数据库中的大文本 ...

  3. windows 下编译64位ffmpeg

    window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...

  4. surface4 笔盖失灵的解决方案

    http://tieba.baidu.com/p/3670357234 先找到设备管理器,找到蓝牙,删除里面所有的设备.然后重启. 之后再次找到蓝牙,匹配pen.就可以用了. 解决的前提是:我确定笔帽 ...

  5. javascript 温故而知新 getBoundingClientRect

    getBoundingClientRect获取元素位置  getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置. getBoundingClient ...

  6. Linux的IO栈

  7. C# 缓存技术

    缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 本章从缓存 ...

  8. hdu - 5033 - Building(单调栈)

    题意:N 幢楼排成一列(1<=N<=10^5),各楼有横坐标 xi(1<=xi<=10^7) 以及高度 hi(1<=hi<=10^7),在各楼之间的Q个位置(1&l ...

  9. ubuntu中文乱码--添加中文字符集

    在Ubuntu支持中文后(方法见上篇文章),默认是UTF-8编码,而Windows中文版默认是GBK编码.为了一致性,通常要把Ubuntu的默认 编码改为GBK.当然你也可以不改,但这会导致我们在两个 ...

  10. spring AOP pointcut expression表达式解析

    Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.Pointcut可以有下列方式来定义或者通过& ...