Javamail 发送附件中文名过长以及乱码问题
2014-04-24 16:49
501 查看
最近在弄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);
通过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 发送附件中文名乱码问题解决
- 【转】Kettle发送邮件步骤遇到附件名是中文名变成乱码的问题解决办法
- Android4.1.2 Email发送邮件附件中文名乱码问题
- Jira饼图上中文乱码,显示为“口”的解决办法,以及问题附件中文名时无法打开终极办法
- javaMail发送邮件附件名乱码问题
- javamail发送带有附件的邮件时遇到的乱码问题解决方案
- 处理wordpress上传中文名附件乱码问题
- 处理wordpress上传中文名附件乱码问题
- (javaWeb)多个附件打包成压缩文件(*.ZIP)以及打包时常见的文件乱码和文件名乱码以及丢失文件或文件损坏问题解决办法
- javamail 附件名保存乱码问题
- java&nbsp;mail&nbsp;解决附件中文名乱码问题
- 【JavaMail开发】使javamail-1.4.2 发送邮件时中文附件乱码或显示"??"的解决办法
- javaMail发送邮件时的中文乱码问题
- javaMail发送邮件,标题/发件人/附件名称乱码
- smtp发送邮件附件时, 如果文件名过长, 会导致附件乱码, 除了重新编译smtp以外, 限制上传文件名长度就是个简便的方法了.
- javamail发送邮件乱码问题解决
- Spring发送电子邮件发件人中文名乱码问题解决
- JavaMail中解决中文附件名乱码的问题
- joomla的attachment组件中文名附件乱码问题
- 邮件发送附件失败和附件名称过长不能解析的问题