zoukankan      html  css  js  c++  java
  • 发送邮件附件名称乱码问题

    公司项目上线都非要弄个什么数据核对,每天下班都要跑好多的规则sql,这不是重点,重点是跑完的结果还要邮件的形式发送给指定领导,
    这不就是意味着一定要加班了吗?必须要有对策!有同事提议不如写一个发送邮件的程序得了,我同意了,所以这个类就在百度的帮助下诞生了。
    哪里都挺成功的,测试的时候也OK了。万万没想到呀!让万恶的别乱码给阴了(发送附件如果附件有名称有中文就会乱码),出现问题最靠的住的还得是百度。
    一行代码轻松搞定,开心。



      1 package com.heyt.util;
      2 
      3 import javax.activation.DataHandler;
      4 import javax.activation.DataSource;
      5 import javax.activation.FileDataSource;
      6 import javax.mail.*;
      7 import javax.mail.internet.*;
      8 import java.io.UnsupportedEncodingException;
      9 import java.util.Properties;
     10 
     11 
     12 public class JavaEMail {
     13 
     14    private Properties  props;//用来存储一些邮件的属性,设置几个等待时间什么的。
     15    private String[] params = new String[2];//用来存储发件人和授权码,要注意的是授权码和密码还不是一回事,这个我就吃了亏
     16    //public JavaEMail(){}
     17 
     18     /**
     19      * @param transportType 邮件发送方式
     20      * @param serviceType 服务器类型
     21      * @param servicePort 服务器端口号
     22      * @param fromEMail   发件人
     23      * @param authPassword 授权码
     24      */
     25    public JavaEMail(String transportType,String serviceType,String  servicePort,String fromEMail ,String authPassword)
     26    {
     27 
     28        //       // 获取默认的 Session 对象。
     29        // 1.创建一个程序与邮件服务器会话对象 Session
     30        Properties tProps = new Properties();
     31        tProps.put("mail.transport.protocol", transportType);//发件的默认方式是不是都是SMTP?
     32        tProps.put("mail.smtp.host",serviceType );//smtp.exmail.qq.com 这个例子是qq的企业邮箱的服务器
     33        tProps.put("mail.smtp.port", servicePort);//一般默认都是 25
     34        // 指定验证为true
     35        tProps.setProperty("mail.smtp.auth", "true");
     36        // props.setProperty("mail.smtp.timeout","1000");
     37        tProps.put("mail.smtp.timeout", 100000);//这几个参数很有必要
     38        tProps.put("mail.smtp.connectiontimeout", 100000);//这几个参数很有必要
     39        tProps.put("mail.smtp.writetimeout",100000);//这几个参数很有必要
     40        props = (Properties) tProps.clone();
     41        params[0]=fromEMail;//如果可以最好弄一个加密的方式
     42        params[1]=authPassword;//如果可以最好弄一个加密的方式
     43    }
     44 
     45     /***
     46      *
     47      * @param mailTO    收件人集合,这个不可以为空,哈哈哈
     48      * @param mailCC    抄送人集合,可以传null,若果是null就当做没有抄送
     49      * @param contentTop 邮件标题,可以传null,默认值是 "您有,一封邮件待查收"
     50      * @param contentText 邮件正文,可以传null,默认值是 "各位好:"
     51      * @param fileName    附件的绝对地址,可以传null,如果是null就默认当做不添加附件
     52      */
     53     public  boolean sendEmail(String[] mailTO,String[] mailCC,String contentTop,String contentText,String fileName)
     54     {
     55         //收件人不能是空
     56         if (mailTO == null || mailTO.equals(""))
     57             return false;
     58         // 验证账号及密码,密码需要是第三方授权码,似乎qq企业邮件的授权码就是密码。
     59         Authenticator auth = new Authenticator() {
     60             @Override
     61             public PasswordAuthentication getPasswordAuthentication() {
     62                 return new PasswordAuthentication(params[0], params[1]);
     63             }
     64         };
     65         Session session = Session.getInstance(props, auth);//居然发现了一个final的类,和String一样,哈哈
     66 
     67         try{
     68             // 创建默认的 MimeMessage 对象。
     69             MimeMessage message = new MimeMessage(session);
     70 
     71             Address addressesTO[] = new Address[mailTO.length];
     72 
     73             //循环收件人
     74             for (int i = 0; i < mailTO.length ; i++)
     75             {
     76                 addressesTO[i] = (Address) new InternetAddress(mailTO[i]).clone();
     77             }
     78             message.addRecipients(Message.RecipientType.TO,addressesTO);//设置收件人
     79             //对抄送人进行处理
     80             if( ! (mailCC == null|| mailCC.equals(""))) {
     81                 Address addressesCC[] = new Address[mailCC.length];
     82                 //循环抄送人
     83                 for (int i = 0; i < mailCC.length; i++)
     84                 {
     85                     addressesCC[i] = (Address) new InternetAddress(mailCC[i]).clone();
     86                 }
     87                 message.addRecipients(Message.RecipientType.CC, addressesCC);//设置抄送人
     88             }
     89             // Set Subject: 头字段
     90             if(contentTop == null || contentTop.equals(""))
     91             {
     92                 message.setSubject("您有,一封邮件待查收");
     93             }else {
     94                 message.setSubject(contentTop);
     95             }
     96             // 创建消息部分
     97             BodyPart messageBodyPart = new MimeBodyPart();
     98             // 消息
     99             if(contentText == null || contentText.equals("")){
    100                 messageBodyPart.setText("各位好:");
    101             }else{
    102                 messageBodyPart.setText(contentText);
    103             }
    104             // 创建多重消息
    105             Multipart multipart = new MimeMultipart();
    106             // 设置文本消息部分
    107             multipart.addBodyPart(messageBodyPart);
    108            // String tFileName = fileName;
    109             //目前没有对目录做校验,后续再添加吧
    110             if (!( fileName == null || fileName.equals(""))){
    111                 // 附件部分
    112                 messageBodyPart = new MimeBodyPart();
    113                 DataSource source = new FileDataSource(fileName);
    114                 messageBodyPart.setDataHandler(new DataHandler(source));
    115          //就只这行可以防止乱码
    116                 String newFileName =  MimeUtility.encodeText(source.getName(),"utf-8",null);
    117                 messageBodyPart.setFileName(newFileName);
    118                 multipart.addBodyPart(messageBodyPart);
    119             }
    120 
    121             // 发送完整消息
    122             message.setContent(multipart,"text/html;charset=utf-8");
    123             //   发送消息
    124             Transport.send(message);
    125 
    126             System.out.println("Sent message successfully....");
    127 
    128         }catch (MessagingException mex) {
    129             mex.printStackTrace();
    130         } catch (UnsupportedEncodingException e) {
    131             e.printStackTrace();
    132         }
    133         return true;
    134     }
    135     public static void main(String[] args) {
    136         String[] mailTO = {"test","test1","test3"};//发送人
    137         String[] mailCC = {"test","test1","test3"};//抄送人
    138         String contentTop = "这是一个邮件的题目";
    139         String contentText = "这是这个邮件的正文";
    140         String fileName = "G:\下载\other\";//如果有附件的话这填写地址
    141         new JavaEMail("1","2","3","4","5").sendEmail(mailTO,mailCC,contentTop,contentText,fileName);
    142     }
    143 }
    144 
    145 
    146 
    147 /* 
    148 <!-- 发送邮件需要的jar java send mail  -->
    149 <dependency>
    150     <groupId>javax.mail</groupId>
    151     <artifactId>mail</artifactId>
    152     <version>1.4.5</version>
    153 </dependency>
    154 <dependency>
    155     <groupId>javax.activation</groupId>
    156     <artifactId>activation</artifactId>
    157     <version>1.1.1</version>
    158 </dependency> */
  • 相关阅读:
    redis常见面试题
    nginx常见的面试题
    python学习笔记(15)pymysql数据库操作
    python中的if not
    python学习笔记(24)-类与对象
    python学习笔记(23)-异常处理
    python学习笔记(22)-os文件操作模块
    Maven---pom.xml配置详解
    maven+jmeter+jenkins集成
    适配器模式
  • 原文地址:https://www.cnblogs.com/heyt/p/11349174.html
Copyright © 2011-2022 走看看