邮件工具类

前两天写了一个发送邮件的工具类,因为之前没有写过相关的代码,所以在网上查了一些资料,然后自己花了近一个礼拜才搞出来(本人菜鸟,勿喷!!!)。期间写了一个直接调用方法(需要传多个参数,然后还要根据参数进行判断等等)的版本,功能是实现了,但是用起来总感觉比较不爽,可读性也不是挺好,所以同事给了个建议,做成链式调用的方式,调用起来也比较方便,可读性也不错,所以就在之前的版本上做了修改。虽然花了比较长的时间,但是能写出一个可读性比较好(自我感觉)的邮件接口也是感觉挺棒的。

现在把代码贴出来,有需要的朋友可以直接拷贝去用,欢迎纠错,但请勿转载!!!

调用方式
/**
    * senderEmail 为开始节点 是发送人的邮箱地址   参数为发件人的邮箱和密码
     * to   主收件人   参数可以是String类型,也可以是List类型 必填
     * cc   是抄送人,参数可以是String类型,List类型
     * bcc  是秘密抄送人,参数可以是String类型,List类型
     * attach   传附件,参数可以是String类型(单个附件路径),List类型(附件路径集合),Map类型(key为文件名,value为内容,value为InputSteeam)
     * send()是结束节点,必须添加
     */
List<String> list = new ArrayList<String>();
list.add("[email protected]");
list.add("");
List<String> attachList = new ArrayList<>();
attachList.add("");
EmailUtils.senderEmail("", "")
.to(list)
.cc(list)
.bcc(list)
.subject("邮件测试1")
.content("Dear All,ahahahahahahahahahaa")
.attach(attachList)
.send();





代码实现
/**
 * 邮件工具类
 * Created by kevensong on 15/12/10.
 */
public class EmailUtils {
    //主收件人
    private String to;
    private List<String> toList = new ArrayList<String>();
    //抄送人
    private String cc;
    private List<String> ccList = new ArrayList<String>();
    //秘密抄送人
    private String bcc;
    private List<String> bccList = new ArrayList<String>();
    //邮件主题
    private String subject;
    //邮件正文
    private String content;
    //附件路径
    private List<String> attachList = new ArrayList<String>();
    //单个附件路径
    private String attach;
    //发送日期  字符串类型
    private String dateStr;
    //发送日期  Date类型
    private Date date;
    //存放需要发送的附件名称和流
    private Map<String, InputStream> map = new HashMap<String, InputStream>();
    //发送人邮箱地址
    private static String senderEmail;
    //发送人邮箱密码
    private static String senderPwd;
    //邮箱服务器信息
    private String mailHost;
    private String mailAuth;

    /**
     *  起始节点
     * @param to
     * @return
     */
    public EmailUtils to(String to){
        this.toList.add(to);
        return this;
    }

    public EmailUtils to(List<String> toList){
        if(this.toList.size() > 0 ){
            this.toList.addAll(toList);
        }else{
            this.toList = toList;
        }
        return this;
    }

    public static EmailUtils senderEmail(String senderEmail, String senderPwd){
        return new EmailUtils(senderEmail, senderPwd);
    }

    public EmailUtils(String senderEmail, String senderPwd){
        this.senderEmail = senderEmail;
        this.senderPwd = senderPwd;
    }

    /**
     * 单个抄送人
     * @param cc
     * @return
     */
    public EmailUtils cc(String cc){
        if(cc.equals("")) return this;
        this.ccList.add(cc);
        return this;
    }

    /**
     * 多个抄送人
     * @param ccList
     * @return
     */
    public EmailUtils cc(List<String> ccList){
        if(this.ccList.size() > 0 ){
            this.ccList.addAll(ccList);
        }else{
            this.ccList = ccList;
        }
        return this;
    }

    /**
     * 单个秘密抄送人
     * @param bcc
     * @return
     */
    public EmailUtils bcc(String bcc){
        if(bcc.equals("")) return this;
        this.bccList.add(bcc);
        return this;
    }

    /**
     * 多个秘密抄送人
     * @param bccList
     * @return
     */
    public EmailUtils bcc(List<String> bccList){
        if(this.bccList.size() > 0 ){
            this.bccList.addAll(bccList);
        }else{
            this.bccList = bccList;
        }
        return this;
    }

    /**
     * 邮件主题
     * @param subject
     * @return
     */
    public EmailUtils subject(String subject){
        this.subject = subject;
        return this;
    }

    /**
     * 邮件正文内容
     * @param content
     * @return
     */
    public EmailUtils content(String content){
        this.content = content;
        return this;
    }

    /**
     * 传多个附件
     * @param attachList
     * @return
     */
    public EmailUtils attach(List<String> attachList){
        this.attachList = attachList;
        return this;
    }

    /**
     * 传单个附件
     * @param attach
     * @return
     */
    public EmailUtils attach(String attach){
        this.attachList.add(attach);
        return this;
    }
    /**
     * key 为文件名     value 为附件流
     * @param key
     * @param value
     * @return
     */
    public EmailUtils attach(String key, InputStream value){
        map.put(key, value);
        return this;
    }


    /**
     * 设置发送日期   String类型
     * @param dateStr
     * @return
     */
    public EmailUtils date(String dateStr){
        this.dateStr = dateStr;
        return this;
    }

    /**
     * 设置邮件发送日期 Date类型
     * @param date
     * @return
     */
    public EmailUtils date(Date date){
        this.date = date;
        return this;
    }

    public EmailUtils mailHost(String mailHost){
        this.mailHost = mailHost;
        return this;
    }

    public EmailUtils mailAuth(String mailAuth){
        this.mailAuth = mailAuth;
        return this;
    }

    public void send() throws Exception {
        if(Is.empty(senderEmail)){
            throw new Exception("发送人邮箱地址不能为空,请初始化发件人邮箱地址");
        }
        if(Is.empty(senderPwd)){
            throw new Exception("发送人邮箱密码不能为空,请初始化发件人邮箱密码");
        }
        if(Is.empty(mailHost)){
            mailHost = "smtp.exmail.qq.com";
        }
        if(Is.empty(mailAuth)){
            mailAuth = "true";
        }
        Properties properties = new Properties();
        properties.put("mail.smtp.host", mailHost);
        properties.put("mail.smtp.auth", mailAuth);
        Session session = Session.getDefaultInstance(properties);
        //设置邮件信息
        Message mimeMessage = getMailMessage(session, toList==null?null:EmailListToAddress(toList),
                ccList==null?null:EmailListToAddress(ccList),
                bccList==null?null:EmailListToAddress(bccList), subject, date);

        Multipart multipart = new MimeMultipart();
        //添加正文
        if(content != null && !content.equals("")){
            BodyPart contentBodyPart = new MimeBodyPart();
            contentBodyPart.setContent(content, "text/html;charest=UTF-8");
            multipart.addBodyPart(contentBodyPart);
        }
        //添加附件,附件内容为空,则不需要添加附件
        addAttach(multipart, mimeMessage, map, attachList);

        Transport transport = session.getTransport("smtp");
        transport.connect(mailHost, senderEmail, senderPwd);
        try{
            transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        }catch(SendFailedException e){
            //无效地址
            Address[] inValidEmail = e.getInvalidAddresses();
            toList = returnToEmail(inValidEmail, toList);
            if(Is.empty(toList)){
                throw new Exception("主收件人的邮箱地址错误,请重新设置主收件人的邮箱地址");
            }
            ccList = returnToEmail(inValidEmail, ccList);
            bccList = returnToEmail(inValidEmail, bccList);
            mimeMessage.setRecipients(Message.RecipientType.TO, EmailListToAddress(toList));
            mimeMessage.setRecipients(Message.RecipientType.CC, EmailListToAddress(ccList));
            mimeMessage.setRecipients(Message.RecipientType.BCC, EmailListToAddress(bccList));
            transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        }
        transport.close();
    }


    /**
     *  获取有效的邮箱地址
     * @param inValidEmail  有效的邮箱地址
     * @param emailsList      发送人类型
     * @return
     * @throws Exception
     */
    private static List<String> returnToEmail(Address[] inValidEmail, List<String> emailsList) throws Exception {
        List<String> list = new ArrayList<String>();
        List<String> addreList = new ArrayList<String>();
        for(Address address : inValidEmail){
            addreList.add(address.toString());
        }
        for(String email : emailsList){
            if(!addreList.contains(email)){
                list.add(email);
            }
        }
        return getNewList(list);
    }

    /**
     * 取出list中重复的数据
     * @param li
     * @return
     */
    public static List<String> getNewList(List<String> li){
        List<String> list = new ArrayList<String>();
        for(int i=0; i<li.size(); i++){
            String str = li.get(i);  //获取传入集合对象的每一个元素
            if(!list.contains(str)){   //查看新集合中是否有指定的元素,如果没有则加入
                list.add(str);
            }
        }
        return list;
    }

    /**
     * 设置message的内容
     * @param session
     * @param toEmail
     * @param ccEmails
     * @param bccEmail
     * @param subject
     * @param date
     * @return
     * @throws Exception
     */
    private static Message getMailMessage(Session session, Address[] toEmail, Address[] ccEmails, Address[] bccEmail,
                                          String subject, Date date) throws Exception {
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发送人
        mimeMessage.setFrom(new InternetAddress(senderEmail));
        //设置主接受人
        if(Is.empty(toEmail)){
            throw new Exception("主收件人的邮箱地址不能为空,请设置主收件人的邮箱地址");
        }
        mimeMessage.setRecipients(Message.RecipientType.TO, toEmail);
        //设置抄送人
        if(!Is.empty(ccEmails)){
            mimeMessage.setRecipients(Message.RecipientType.CC, ccEmails);
        }
        //设置秘密抄送人
        if(!Is.empty(bccEmail)) {
            mimeMessage.setRecipients(Message.RecipientType.BCC, bccEmail);
        }
        //设置邮件主题
        if(!Is.empty(subject)) {
            mimeMessage.setSubject(subject);
        }
        //设置邮件发送时间,如果传入的时间小于当前的时间,则发送时间为当前时间,否则为传入的时间
        if(Is.empty(date)){
            mimeMessage.setSentDate(new Date());
        }else{
            Date now = new Date();
            if(now.getTime() > date.getTime()){
                mimeMessage.setSentDate(new Date());
            }else{
                mimeMessage.setSentDate(date);
            }
        }
        return mimeMessage;
    }

    /**
     *  添加附件
     * @param multipart
     * @param mimeMessage
     * @param map   key为附件名,value为附件内容
     * @param urlPath
     * @throws Exception
     */
    private static void addAttach(Multipart multipart, Message mimeMessage,
                                  Map<String,InputStream> map, List<String> urlPath) throws Exception{
        if(!Is.empty(urlPath)){
            for(String path : urlPath){
                if(Is.empty(path))break;
                BodyPart bodyPart = new MimeBodyPart();
                FileDataSource fileDataSource = new FileDataSource(path);
                bodyPart.setDataHandler(new DataHandler(fileDataSource));
                bodyPart.setFileName(MimeUtility.encodeWord(fileDataSource.getName(), "utf-8", null));
                multipart.addBodyPart(bodyPart);
            }
        }
        if(!Is.empty(map)){
            for(String fileName : map.keySet()){
                if(Is.empty(fileName))break;
                InputStream content = map.get(fileName);
                //根据文件名获取mimeType
                String mimeType = new MimetypesFileTypeMap().getContentType(fileName);
                BodyPart bodyPart = new MimeBodyPart();
                ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(content, mimeType);
                bodyPart.setDataHandler(new DataHandler(byteArrayDataSource));
                //设置附件名称
                if(fileName != null && !fileName.equals("")){
                    bodyPart.setFileName(MimeUtility.encodeWord(fileName, "utf-8", null));
                }
                multipart.addBodyPart(bodyPart);
            }
        }
        mimeMessage.setContent(multipart);
    }

    /**
     * List类型的邮件地址转换成Address[]
     * @param emailList
     * @return
     * @throws AddressException
     */
    private static InternetAddress[] EmailListToAddress (List<String> emailList) throws AddressException {
        if(Is.empty(emailList)) return null;
        InternetAddress[] emails = new InternetAddress[emailList.size()];
        int i = 0 ;
        for(String email : emailList){
            emails[i] = new InternetAddress(email);
            i ++ ;
        }
        return emails;
    }

    /**
     * String类型的邮件地址(用“,”隔开)转换成Address[]
     * @param emails
     * @return
     * @throws AddressException
     */
    private static InternetAddress[] EmailStringToAddress (String emails) throws AddressException {
        if(Is.empty(emails)) return null;
        int len = emails.split(",").length ;
        String[] str = emails.split(",");
        int i = 0 ;
        InternetAddress[] emailsAddre = new InternetAddress[len] ;
        for(String email : str){
            emailsAddre[i] = new InternetAddress(email) ;
            i ++ ;
        }
        return emailsAddre;
    }

}

你可能感兴趣的:(EmailUtils)