`

邮件工具类

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

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

调用方式
/**
    * 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("ksjskbgshg@qq.com");
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;
    }

}
1
0
分享到:
评论
3 楼 IT小将 2015-12-16  
Is.empty()引用的Is.js中的,就是个简单的判空,可以自己适当的改成senderEmail==null或senderEmail==''
2 楼 yujiaao 2015-12-16  
static class Is {

public static boolean empty(String str) {
return StringUtils.isEmpty(str);
}

public static boolean empty(Collection<?> list) {
return CollectionUtils.isEmpty(list);
}

public static boolean empty(Address[] toEmail) {
return toEmail == null || toEmail.length<=0;
}

public static boolean empty(Date date) {
return date==null || date.before(new Date(0));
}

public static boolean empty(Map<?, ?> map) {
return MapUtils.isEmpty(map);
}

}
1 楼 yujiaao 2015-12-16  
老大,你的Is.empty能不能贴出来啊?

相关推荐

    java发送邮件工具类

    Java发送邮件工具类是Java开发中常用的一种技术,主要用于企业级应用中发送通知、验证码、报表等信息。这个工具类通常基于JavaMail API实现,它允许开发者通过编程方式发送电子邮件。下面将详细介绍Java发送邮件的...

    java版发送邮件工具类

    总结来说,`java版发送邮件工具类`利用`java email`库,特别是`mail.jar`,为开发者提供了一种简便的方式来发送电子邮件。通过理解和使用`SendJMail.java`这样的工具类,你可以轻松地集成邮件发送功能到你的Java应用...

    发送邮件工具类,支持QQ邮箱

    这个名为“发送邮件工具类,支持QQ邮箱”的程序库或代码模块专门设计用于帮助开发者便捷地通过QQ邮箱发送带有附件的邮件。QQ邮箱是腾讯公司提供的免费电子邮箱服务,具有稳定性强、功能丰富的特点,深受用户喜爱。...

    邮件发送工具类

    8. **可配置性**:为了适应不同的邮件服务提供商,邮件工具类通常设计为可配置,允许开发者根据实际情况调整SMTP服务器参数。 9. **重试机制**:为了提高邮件发送的可靠性,工具类可能还包含邮件发送失败后的重试...

    java 发送带模板的邮件工具类

    Java发送带模板的邮件工具类是一种实用的编程实践,它允许开发者通过自定义HTML模板来创建个性化的电子邮件。在Java中,我们可以利用`javax.mail`库来实现这个功能。这个库提供了丰富的API,用于发送、接收和处理...

    发送邮件工具类

    发送邮件

    java发送邮件工具

    java发送邮件工具类,用于java程序实现邮件的发送功能

    java 发送邮件 工具类

    ### Java发送邮件工具类知识点详解 #### 一、概述 在Java开发中,发送电子邮件是一项常见且实用的功能,尤其在企业级应用中更是不可或缺的一部分。本文将详细介绍如何使用Java发送邮件,并通过一个具体的示例代码...

    发送邮件工具类.rar

    这个名为"发送邮件工具类.rar"的压缩包显然包含了一个Java工具类,用于简化邮件发送过程。下面,我们将深入探讨Java中如何实现邮件发送,以及相关的知识点。 首先,Java提供了JavaMail API来处理邮件发送。这个API...

    javaMail获取发送邮件工具类.zip

    在这个名为 "javaMail获取发送邮件工具类.zip" 的压缩包中,我们可能找到了一个已经封装好的 Java 类,简化了使用 JavaMail 进行邮件操作的过程。 1. **SMTP(Simple Mail Transfer Protocol)**: SMTP 用于发送...

    java发送邮件工具类,相关jar也有

    以下是对Java发送邮件工具类及其相关jar文件的详细解释: 1. **JavaMail API介绍**: JavaMail API是Java平台上的一个标准API,它提供了与邮件服务器交互的一组接口和类。主要包含以下组件: - `javax.mail`:...

    发送邮件工具类-java

    发送邮件工具类-java

    Java 借助163或qq等邮箱发送邮件工具类 基础内容 不涉及图片附件等

    Java 借助163或qq等邮箱发送邮件工具类 基础内容 不涉及图片附件等

    java mail工具类

    这个工具类的创建旨在简化邮件处理的复杂性,使开发者能够便捷地集成邮件功能。以下是对JavaMail工具类及其相关知识点的详细说明: 1. **JavaMail API**: JavaMail API 是Java平台上的标准邮件接口,提供了发送、...

    java 发送邮件 小工具类+ mail.jar

    这个"java 发送邮件 小工具类+ mail.jar"提供了一个便捷的解决方案。它包含了一个Java类,该类封装了发送电子邮件的过程,以及一个名为`mail.jar`的库,这个库可能包含了JavaMail API,是发送邮件所必需的。 ...

    JAVA邮件发送工具类(支持同步和异步发送邮件以及附件信息)

    JAVA邮件发送工具类(支持同步和异步发送邮件以及附件信息),支持多个抄送邮件发送。

    java代码-java邮件工具类代码合集

    java代码-java邮件工具类代码合集 ——学习参考资料:仅用于个人学习使用!

    java邮件发送工具类

    java邮件发送工具类java邮件发送工具类包含gmail

Global site tag (gtag.js) - Google Analytics