zoukankan      html  css  js  c++  java
  • 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(" ", "").replaceAll(" ", "");
    fileBodyPart.setFileName(filename);

     
  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/apache-x/p/5436714.html
Copyright © 2011-2022 走看看