史上最强悍的JavaMail调用封装-可定时定量进行群发邮件

 注:博主写此API所用环境:jdk1.6,jmail.jar,activation-2.2.1.jar,邮箱客户端为Foxmail7.2,本博文主要使用的是腾讯QQ邮箱,没有做兼容处理,废话不说了,看代码!

1:JMail邮件对象类(JMailInfo.java)
package jmailUtil;
import java.util.Properties;
/**
 * @author JimYang<br>
 * 邮件对象类
 */
public class JMailInfo {
    /**
     * private constructor
     */
    private JMailInfo() {
    }
    /**
     *
     * @author Jim Yang
     *
     */
    private static class InstanceHandle {
        private static JMailInfo mailSenderInfo = new JMailInfo();
    }
    /**
     * this function is thread-safe
     * @return MailSenderInfo
     */
    public static JMailInfo getInstance(){
        return InstanceHandle.mailSenderInfo;
    }
    /**
     * @param serverHost the serverHost to set
     */
    public void setServerHost(String serverHost) {
        this.serverHost = serverHost;
    }
    /**
     * @return the serverHost
     */
    public String getServerHost() {
        return serverHost;
    }
    /**
     * @param serverPort the serverPort to set
     */
    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }
    /**
     * @return the serverPort
     */
    public String getServerPort() {
        return serverPort;
    }
    /**
     * @param jmailSenderAddress the jmailSenderAddress to set
     */
    public void setJmailSenderAddress(String jmailSenderAddress) {
        this.jmailSenderAddress = jmailSenderAddress;
    }
    /**
     * @return the jmailSenderAddress
     */
    public String getJmailSenderAddress() {
        return jmailSenderAddress;
    }
    /**
     * multiple address please divided by ";",like this "[email protected];[email protected];[email protected]"
     * @param jmailAccepterAddress the jmailAccepterAddress to set
     */
    public void setJmailAccepterAddress(String jmailAccepterAddress) {
        this.jmailAccepterAddress = jmailAccepterAddress;
    }
    /**
     *
     * @return the jmailAccepterAddress
     */
    public String getJmailAccepterAddress() {
        return jmailAccepterAddress;
    }
    /**
     * @param jmailSenderName the jmailSenderName to set
     */
    public void setJmailSenderName(String jmailSenderName) {
        this.jmailSenderName = jmailSenderName;
    }
    /**
     * @return the jmailSenderName
     */
    public String getJmailSenderName() {
        return jmailSenderName;
    }
    /**
     * @param jmailSenderPwd the jmailSenderPwd to set
     */
    public void setJmailSenderPwd(String jmailSenderPwd) {
        this.jmailSenderPwd = jmailSenderPwd;
    }
    /**
     * @return the jmailSenderPwd
     */
    public String getJmailSenderPwd() {
        return jmailSenderPwd;
    }
    /**
     * @param jmailSubject the jmailSubject to set
     */
    public void setJmailSubject(String jmailSubject) {
        this.jmailSubject = jmailSubject;
    }
    /**
     * @return the jmailSubject
     */
    public String getJmailSubject() {
        return jmailSubject;
    }
    /**
     * @param jmailBody the jmailBody to set
     */
    public void setJmailBody(String jmailBody) {
        this.jmailBody = jmailBody;
    }

/**
     * @return the jmailBody
     */
    public String getJmailBody() {
        return jmailBody;
    }
    /**
     * @param isValidated the isValidated to set
     */
    public void setValidated(boolean isValidated) {
        this.isValidated = isValidated;
    }
    /**
     * @return the isValidated
     */
    public boolean isValidated() {
        return isValidated;
    }
    /**
     * @param jmailAttachFile the jmailAttachFile to set
     */
    public void setJmailAttachFile(String jmailAttachFile) {
        this.jmailAttachFile = jmailAttachFile;
    }
    /**
     * @return the jmailAttachFile
     */
    public String getJmailAttachFile() {
        return jmailAttachFile;
    }
    /**
     * @return the jmailProperties
     */
    public Properties getJmailProperties() {
        Properties prop = new Properties();
        prop.put("mail.smtp.host", this.getServerHost());
        prop.put("mail.smpt.port", this.getServerPort());
        prop.put("mail.smtp.auth", this.isValidated());
        return prop;
    }
    /**
     * multiple address please divided by ";",like this "[email protected];[email protected];[email protected]"
     * @param ccAddress the ccAddress to set
     */
    public void setCcAddress(String ccAddress) {
        this.ccAddress = ccAddress;
    }
    /**
     * @return the ccAddress
     */
    public String getCcAddress() {
        return ccAddress;
    }
    /**
     * multiple address please divided by ";",like this "[email protected];[email protected];[email protected]"
     * @param bccAddress the bccAddress to set
     */
    public void setBccAddress(String bccAddress) {
        this.bccAddress = bccAddress;
    }
    /**
     * @return the bccAddress
     */
    public String getBccAddress() {
        return bccAddress;
    }
    private String serverHost = null;
    private String serverPort = null;
    private String jmailSenderAddress = null;
    private String jmailAccepterAddress = null;
    private String jmailSenderName = null;
    private String jmailSenderPwd = null;
    private String jmailSubject = null;
    private String jmailBody = null;
    private boolean isValidated = true;
    private String jmailAttachFile;
    private String ccAddress = null;
    private String bccAddress = null;
    public static final String QQMAIL_HOST = "smtp.qq.com";
    public static final String QQMAIL_PORT = "465";
}
2:发送邮件的工具类(JMailSendUtil.java)
package jmailUtil;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.AddressException;
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;
/**
 * @author JimYang
 */
public class JMailSendUtil {
   private JMailSendUtil() {};
   /**
    * 发送纯文本格式邮件,可以发给多人,可以添加附件,抄送,暗抄送。
    * @param jmailInfo
    * @throws MessagingException
    * @throws IOException
    */
   public static void SendSmtpTextMail(JMailInfo jmailInfo)
     throws MessagingException, IOException{
    Properties prop = jmailInfo.getJmailProperties();
    prop.put("mail.transport.protocol","smtp");
    Authenticator authenticator = getAuth(jmailInfo.getJmailSenderName(), jmailInfo.getJmailSenderPwd());
    Session jmailSession = Session.getDefaultInstance(prop, authenticator);
    Address senderAddress = new InternetAddress(jmailInfo.getJmailSenderAddress());
    Message mmsg = new MimeMessage(jmailSession);
    mmsg.setFrom(senderAddress);
    if (!checkNULL(jmailInfo.getJmailAccepterAddress())) {
       mmsg.addRecipients(RecipientType.TO, addressBuilder(jmailInfo.getJmailAccepterAddress()));
    }
    if (!checkNULL(jmailInfo.getCcAddress())) {
         mmsg.addRecipients(RecipientType.CC, addressBuilder(jmailInfo.getCcAddress()));
     }
    if (!checkNULL(jmailInfo.getBccAddress())) {
         mmsg.addRecipients(RecipientType.BCC, addressBuilder(jmailInfo.getBccAddress()));
     }
    mmsg.setSubject(jmailInfo.getJmailSubject());
    mmsg.setSentDate(new Date());
    Multipart multipart = new MimeMultipart();
    BodyPart bodyPart = new MimeBodyPart();
    bodyPart.setContent(jmailInfo.getJmailBody(), "text/plain;charset=UTF-8");
    multipart.addBodyPart(bodyPart);
    if (!checkNULL(jmailInfo.getJmailAttachFile())) {
        buildAttachFile(multipart, jmailInfo.getJmailAttachFile());
        mmsg.setContent(multipart);
    }
    mmsg.setContent(multipart);
    mmsg.saveChanges();
    Transport.send(mmsg);
    }
   /**
    * 发送HTML格式邮件,可CC,bcc,发给多人,多个附件
    * @param jmailInfo
    * @throws MessagingException
    * @throws IOException
    */
public static void SendSmtpHtmlMail(JMailInfo jmailInfo) throws MessagingException, IOException {
     Properties prop = jmailInfo.getJmailProperties();
        prop.put("mail.transport.protocol","smtp");
        Authenticator authenticator = getAuth(jmailInfo.getJmailSenderName(), jmailInfo.getJmailSenderPwd());
        Session jmailSession = Session.getDefaultInstance(prop, authenticator);
        Address senderAddress = new InternetAddress(jmailInfo.getJmailSenderAddress());
        Message mmsg = new MimeMessage(jmailSession);
        mmsg.setFrom(senderAddress);
        if (!checkNULL(jmailInfo.getJmailAccepterAddress())) {
           mmsg.addRecipients(RecipientType.TO, addressBuilder(jmailInfo.getJmailAccepterAddress()));
        }
        if (!checkNULL(jmailInfo.getCcAddress())) {
             mmsg.addRecipients(RecipientType.CC, addressBuilder(jmailInfo.getCcAddress()));
         }
        if (!checkNULL(jmailInfo.getBccAddress())) {
             mmsg.addRecipients(RecipientType.BCC, addressBuilder(jmailInfo.getBccAddress()));
         }
        mmsg.setSubject(jmailInfo.getJmailSubject());
        mmsg.setSentDate(new Date());
        Multipart multipart = new  MimeMultipart();
        BodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent(jmailInfo.getJmailBody(), "text/html;charset=UTF-8");
        multipart.addBodyPart(bodyPart);
        if (!checkNULL(jmailInfo.getJmailAttachFile())) {
            BodyPart[] bodyParts = BuildAttachmentFile(jmailInfo.getJmailAttachFile());
            for (BodyPart body:bodyParts) {
                multipart.addBodyPart(body);
            }
        }
        mmsg.setContent(multipart);
        mmsg.saveChanges();
        Transport.send(mmsg);
}
/**
 *
 * @param mailInfo 邮件主体
 * @param delay 延迟时间
 * @param timeUnit 时间单位(时,分,秒,天,毫秒...)
 * @param htmlFlag 是否为HTML邮件
 */
public static void SendTimeScheduleSmtpMail(final JMailInfo mailInfo,long delay,TimeUnit timeUnit,final boolean htmlFlag) {
    final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(2);
 scheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
    scheduledThreadPoolExecutor.schedule(new Runnable() {
        @Override
        public void run() {
                try {
                    if (!htmlFlag) {
                        SendSmtpTextMail(mailInfo);
                    } else {
                    SendSmtpHtmlMail(mailInfo);}
                } catch (MessagingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    },delay, timeUnit);
    scheduledThreadPoolExecutor.shutdown();
}
/**
 * 定时重发邮件,支持纯文本和HTML,后者可以直接加入HTML标签来布局邮件显示效果。<br>
 * 邮件重发次数为java <code>int</code>类型,注意取值范围
 * @param mailInfo 邮件信息
 * @param delayTime 延迟时间
 * @param repeatStep 重发间隔时间
 * @param repeatTimes 重发次数
 * @param timeUnit 时间单位
 * @param htmlFlag 是否发送HTML邮件
 */
public static void SendTimeScheduleRepeatSmtpMail(final JMailInfo mailInfo,long delayTime,long repeatStep,final int repeatTimes,TimeUnit timeUnit,final boolean htmlFlag) {
    final ScheduledThreadPoolExecutor schThPoolExce = new ScheduledThreadPoolExecutor(2);
 schThPoolExce.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
schThPoolExce.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
  schThPoolExce.scheduleAtFixedRate(new Runnable() {
    //定时重复执行自定义任务
        int i=0;
        @Override
        public void run() {
            ++i;
            int j = repeatTimes;
            if (i <= j) {
            try {
                //System.out.println("第 "+i+"份邮件开始发送。。");
                if (htmlFlag) {
                    SendSmtpHtmlMail(mailInfo);
                } else {
                    SendSmtpTextMail(mailInfo);
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            //System.out.println("第 "+i+"份邮件发送完成。。。");
            }
        } else {
         //System.out.println("定时重复任务完成,共重复发送 "+(i>1?(i-1):i)+"份邮件。");
            schThPoolExce.shutdownNow();
        }
    }},delayTime, repeatStep, timeUnit);
    schThPoolExce.shutdown();
}
/**
    * 邮箱登陆权限验证获取
    * @param userName 邮箱登陆用户名
    * @param userPwd 登陆密码
    * @return
    */
   private static Authenticator getAuth(String userName,String userPwd) {
      Object lock = new Object();
      final String name = userName;
      final String pwd = userPwd;
      Authenticator authenticator = null;
      synchronized (lock) {
           authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(name,pwd);
            }
        };
      }
    return authenticator;
   }
   /**
    * 解析邮件地多个地址用英文分号隔开,返回邮件地址数组
    * @param addressStr
    * @return
    */
   private static Address [] addressBuilder(String addressStr) {
       String [] temp = null;
       Address[] tempAddressGroup = null;
       try {
        if (addressStr.indexOf(";") != -1) {
               temp = addressStr.split(";");
               tempAddressGroup = new InternetAddress[temp.length];
               for (int i=0;i<temp.length;i++) {
                   tempAddressGroup[i] = new InternetAddress(temp[i]);
               }
           } else {
              tempAddressGroup = new InternetAddress[]{new InternetAddress(addressStr)};
           }
    } catch (AddressException e) {
        e.printStackTrace();
    }
    return tempAddressGroup;
   }
   private static boolean checkNULL(String addressStr){
       if (addressStr == null) {
           return true;
       } else if (addressStr.trim().equals("")) {
        return true;
       }else {
           return false;
       }
   }
   /**
    * 解析附件内容,返回一个或者多个附件
    * @param filePaths 附件地址,多个地址用英文的分号(;)号隔开
    * @return
    * @throws MessagingException
    * @throws IOException
    */
   private static BodyPart[] BuildAttachmentFile(String filePaths) throws MessagingException, IOException{
       BodyPart[] parts = null;
       if (filePaths.indexOf(";") != -1) {
           String [] paths = filePaths.split(";");
           parts = new MimeBodyPart[paths.length];
           for (int i = 0;i<paths.length;i++) {
                   FileDataSource fileDataSource = new FileDataSource(paths[i]);
                   MimeBodyPart body = new MimeBodyPart();
                   body.setFileName(MimeUtility.encodeWord(fileDataSource.getName()));
                   body.setDataHandler(new DataHandler(fileDataSource));
                   parts[i] = body;
           }
       } else {
           MimeBodyPart body = new MimeBodyPart();
           FileDataSource fds = new FileDataSource(filePaths);
           body.setDataHandler(new DataHandler(fds));
           body.setFileName(MimeUtility.encodeWord(fds.getName()));
           parts = new BodyPart[]{body};
           
       }
    return parts;
   }
   /**
    * 解析附件路径,并且将解析成功后的附件加入到附件对象的主体,作为邮件附件发送。
    * @param multipart 附件主体
    * @param filePaths 附件路径
    */
   private static void buildAttachFile(Multipart multipart,String filePaths) {
       try {
        if (filePaths.indexOf(";") != -1) {
               String [] paths = filePaths.split(";");
               for (int i = 0;i<paths.length;i++) {
                       FileDataSource fileDataSource = new FileDataSource(paths[i]);
                       MimeBodyPart body = new MimeBodyPart();
                       body.setFileName(MimeUtility.encodeWord(fileDataSource.getName()));
            body.setDataHandler(new DataHandler(fileDataSource));
            multipart.addBodyPart(body);
               }
           } else {
               MimeBodyPart body = new MimeBodyPart();
               FileDataSource fds = new FileDataSource(filePaths);
               body.setDataHandler(new DataHandler(fds));
      //对标题编码,不然附件无法显示出来         body.setFileName(MimeUtility.encodeWord(fds.getName()));
               multipart.addBodyPart(body);
           }
    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }
}
3:个人测试类(Test.java)

package jmailUtil;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
       JMailInfo mailInfo = JMailInfo.getInstance();
       mailInfo.setServerHost(JMailInfo.QQMAIL_HOST);
       mailInfo.setServerPort(JMailInfo.QQMAIL_PORT);

       mailInfo.setJmailSenderAddress("23*@qq.com");
       mailInfo.setJmailAccepterAddress("jimyang*@foxmail.com");
       //mailInfo.setCcAddress("*[email protected]");
       //mailInfo.setBccAddress("*[email protected]");
       mailInfo.setJmailSubject("JMAIL邮件发送!");

        //QQ邮箱

        mailInfo.setJmailSenderName("*[email protected]");

        //QQ邮箱密码

       mailInfo.setJmailSenderPwd("**********");
      // mailInfo.setJmailAttachFile("附件路径,多个附件用;分开");
       long start = System.currentTimeMillis();
       mailInfo.setJmailBody("定时重复邮件,任务延迟2秒开始发送,之后每隔5秒执行一次发送任务!");
 JMailSendUtil.SendTimeScheduleRepeatSmtpMail(mailInfo,1,2,4,TimeUnit.SECONDS,true);
       System.out.println("发送成功!用时:"+Long.toString(System.currentTimeMillis()-start)+"毫秒");
    }   
}

时间: 2024-10-25 03:16:47

史上最强悍的JavaMail调用封装-可定时定量进行群发邮件的相关文章

史上最强大的selenium webdriver的封装

放出这个类,用法见测试用例. 1.基于selenium的二次封装,整体代码非常短易于理解,带有两个自定义方法示例供参考,易于扩展. 2.支持无限实例化此类,仍然保持使用同一个浏览器窗口. 3.支持使用自定义的方法名字,同时全所未有的支持了直接性的使用所有此类中没有定义的方法,但在官方类中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)这种写法. 4.其余想自定义名称的方法可以在这个类下面接着写或者继承这个类再添加其他更多方法

Android事件分发机制详解:史上最全面、最易懂

前言 Android事件分发机制是每个Android开发者必须了解的基础知识 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天,我将全面总结Android的事件分发机制,我能保证这是市面上的最全面.最清晰.最易懂的 本文秉着"结论先行.详细分析在后"的原则,即先让大家感性认识,再通过理性分析从而理解问题: 所以,请各位读者先记住结论,再往下继续看分析: 文章较长,阅读需要较长时间,建议收藏等充足时间再进行阅读 目

应用程序开发之模仿史上最牛游戏(三)

声明:转载请注明http://www.cnblogs.com/letougaozao/p/3720679.html 关卡解锁 关卡状态的设计 一.解锁动画(点一下解锁) 解锁前后 监听touch end方法,使用涂层layer动画 -加入QuartzCore.framework框架 -动画包括哪些内容呢?(注意播放声音的代码) 1??整个关卡摇摆两下(旋转动画).并且变大(缩放动画) 2??搁层消失(直接移除) 1.封装一个动画组的方法 - (CAAnimationGroup *)animati

史上最全、最深、最细JAVA300集全套39.4G视频课程免费分享

尚学堂JAVA300集大型基础视频课程(史上最全.最深.最细) 中国首套大型JAVA技术视频 [已更新完至300集] 还在为如何学习JAVA技术而迷茫吗?还在为如何学习Android技术而迷茫吗? java300集大型基础视频课程,现已发布第三季更新至(300)集. 史上最全:覆盖工作中需要的所有技术点. 史上最细:讲师授课代码全部手工敲出,真正的手把手教授您如何编程. 史上最深:我们的基础视频也深刻的从内存结构进行分析.JDK源代码进行分析,这都是高手的必备技能.高手从入门抓起.入门时培养良好

应用程序开发之模仿史上最牛游戏(四)

一.需要一个新的控制器(ReadyViewController) -新建控制器,通过push方式到这个新控制器 -给控制器的view制定类(根据图片选择颜色) -给线起名字 1??给每一个Stage添加手势监听 //2.4为stageView添加手势监听 [stageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(itemClick:)]]; 2??需要控

史上最全、JavaScript基础篇

索宁 Hot summer nights mid July, when you and  I were forever wild. 首页 新随笔 联系 管理 随笔 - 12  文章 - 5  评论 - 19 史上最全.JavaScript基础篇 本章内容: 简介 定义 注释 引入文件 变量 运算符 算术运算符 比较运算符 逻辑运算符 数据类型 数字 字符串 布尔类型 数组 Math 语句 条件语句(if.switch) 循环语句(for.for in.while.do-while) label语

.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

一.前言 经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS.下面一起来学习吧! 二.JS调用ActiveX方法 只需在UserControl子类中(即自定义的ActiveX控件中),编写公共方法即可. C# [Guid("0203DABD-51B8-4E8E-A1EB-156950EE1668")] public partial class Uploader : UserControl, IObjectSafety { p

史上最难PHPer笔试题,40分就能月薪过万!附答案

请批判性的学习,欢迎大牛指正错误 1.有关PHP字符串的说法,不对的是:A.如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1.B.PHP的字符串在内部是字节组成的数组,用花括号访问或修改字符串对多字节字符集很不安全.C.substr().strpos().strlen().htmlentities() 处理字符串时依据的编码方式是相同的.D.一个布尔值 Boolean 的 true 被转换成 string 的 " 1 ",false 被转换成

史上最简单的 Spring MVC 教程(十)

1 前言 在史上最简单的 Spring MVC 教程(九)中,咱们已经实现了图片的上传及显示功能,那么接下来,在本篇博文中,咱们更进一步,以实体类(Person)中的字段"name"和控制器(PersonController)中的方法 updatePersonList 为例,实现参数的校验功能. 2 注解示例 - 参数校验 老规矩,首先给出项目结构图: 在给出代码之前, 咱们先明确参数校验的步骤: 导入参数校验的 jar 包: 在实体上配置需要校验的属性: 在控制器的方法中用注解 @V