通過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);