Javamail 發送附件中文名過長以及亂碼問題


 
最近在弄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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM