动手写批量邮件发送器


在推广当中一定会用到的武器,那就是发送大量的营销性质的邮件。对于个人站长来说,也会用到,用于推广的自己的站点。同时由于搭建smtp服务器需要一定的技术及成本,为此我们可以利用一些免费的smtp服务器。比如说,新浪邮箱、网易邮箱、雅虎邮箱等等都会提供smtp服务,但是免费的smtp服务器会有发送邮件数目的限制,为此需要申请很多这样的邮箱,然后随机挑选一个邮箱来发送邮件。

 



 
基上以上的这些需求,我编写了一个利用线程池,随机挑选发信箱的批量邮件发送器。在此分享给各位学友。。。

 

伦理片 http://www.dotdy.com/

EmailConfig.java

这是发信邮件的配置类:

 

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. public class EmailConfig {  
  4.     private String username;  
  5.     private String password;  
  6.     private String smtpHost;  
  7.     private String serverPort;  
  8.     private boolean isSSL;  
  9.   
  10.     public String getUsername() {  
  11.         return username;  
  12.     }  
  13.   
  14.     public void setUsername(String username) {  
  15.         this.username = username;  
  16.     }  
  17.   
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.   
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25.   
  26.     public String getSmtpHost() {  
  27.         return smtpHost;  
  28.     }  
  29.   
  30.     public void setSmtpHost(String smtpHost) {  
  31.         this.smtpHost = smtpHost;  
  32.     }  
  33.   
  34.     public String getServerPort() {  
  35.         return serverPort;  
  36.     }  
  37.   
  38.     public void setServerPort(String serverPort) {  
  39.         this.serverPort = serverPort;  
  40.     }  
  41.   
  42.     public boolean isSSL() {  
  43.         return isSSL;  
  44.     }  
  45.   
  46.     public void setSSL(boolean isSSL) {  
  47.         this.isSSL = isSSL;  
  48.     }  
  49. }  

 

EmailContent.java

这是邮件内容的封装类:

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. public class EmailContent {  
  4.     private String subject;  
  5.     private String content;  
  6.   
  7.     public String getSubject() {  
  8.         return subject;  
  9.     }  
  10.   
  11.     public void setSubject(String subject) {  
  12.         this.subject = subject;  
  13.     }  
  14.   
  15.     public String getContent() {  
  16.         return content;  
  17.     }  
  18.   
  19.     public void setContent(String content) {  
  20.         this.content = content;  
  21.     }  
  22. }  

 

EmailAuthenticator.java

这是用于发信邮件的用户名密码校验类:

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. import javax.mail.Authenticator;  
  4. import javax.mail.PasswordAuthentication;  
  5.   
  6. public class EmailAuthenticator extends Authenticator {  
  7.     private String username;  
  8.     private String password;  
  9.   
  10.     public EmailAuthenticator() {  
  11.     }  
  12.   
  13.     public EmailAuthenticator(String username, String password) {  
  14.         this.username = username;  
  15.         this.password = password;  
  16.     }  
  17.   
  18.     @Override  
  19.     protected PasswordAuthentication getPasswordAuthentication() {  
  20.         return new PasswordAuthentication(username, password);  
  21.     }  
  22. }  

 

RandomUtil.java

这是产生随机数的工具类:

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. import java.util.Random;  
  4.   
  5. public class RandomUtil {  
  6.   
  7.     public static int getRandomInt(int size) {  
  8.         Random random = new Random();  
  9.         return random.nextInt(size);  
  10.     }  
  11. }  

 

EmailHelper.java

这是邮件发送器的核心类:

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5. import java.util.Properties;  
  6. import java.util.concurrent.ExecutorService;  
  7. import java.util.concurrent.Executors;  
  8.   
  9. import javax.mail.Address;  
  10. import javax.mail.BodyPart;  
  11. import javax.mail.Message;  
  12. import javax.mail.Multipart;  
  13. import javax.mail.Session;  
  14. import javax.mail.Transport;  
  15. import javax.mail.internet.InternetAddress;  
  16. import javax.mail.internet.MimeBodyPart;  
  17. import javax.mail.internet.MimeMessage;  
  18. import javax.mail.internet.MimeMultipart;  
  19. import javax.mail.internet.MimeUtility;  
  20.   
  21. public class EmailHelper {  
  22.     private ExecutorService executorService;  
  23.   
  24.     public EmailHelper() {  
  25.         // 默认启动线程个数为10的线程池  
  26.         executorService = Executors.newFixedThreadPool(10);  
  27.     }  
  28.   
  29.     public EmailHelper(int num) {  
  30.         // 指定初始化线程个数为num的线程池  
  31.         executorService = Executors.newFixedThreadPool(num);  
  32.     }  
  33.   
  34.     public void sendMail(List receiveAdds, List emailConfigs, EmailContent emailContent) {  
  35.         // 用于发送邮件的邮箱配置个数  
  36.         int size = emailConfigs.size();  
  37.   
  38.         // 循环待发送的邮箱地址  
  39.         for (String receiveAdd : receiveAdds) {  
  40.             // 随机获取一个用于发送邮件的邮箱配置  
  41.             EmailConfig emailConfig = emailConfigs.get(RandomUtil.getRandomInt(size));  
  42.             executorService.execute(new EmailItem(emailConfig, emailContent, receiveAdd));  
  43.         }  
  44.     }  
  45.   
  46.     public void shutdown() {  
  47.         executorService.shutdown();  
  48.     }  
  49.   
  50.     /** 
  51.      * 这个内部类,是真正用于发送邮件 
  52.      */  
  53.     class EmailItem implements Runnable {  
  54.         private EmailConfig emailConfig;  
  55.         private EmailContent emailContent;  
  56.         private String receiveAdd;  
  57.   
  58.         public EmailItem(EmailConfig emailConfig, EmailContent emailContent, String receiveAdd) {  
  59.             this.emailConfig = emailConfig;  
  60.             this.emailContent = emailContent;  
  61.             this.receiveAdd = receiveAdd;  
  62.         }  
  63.   
  64.         @Override  
  65.         public void run() {  
  66.             Properties prop = new Properties();  
  67.             prop.put("mail.smtp.host", emailConfig.getSmtpHost());  
  68.             prop.put("mail.smtp.port", emailConfig.getServerPort());  
  69.             prop.put("mail.smtp.auth""true");  
  70.             String username = emailConfig.getUsername();  
  71.             EmailAuthenticator authenticator = new EmailAuthenticator(username, emailConfig.getPassword());  
  72.             // 如果需要ssl来发送邮件,则  
  73.             if (emailConfig.isSSL()) {  
  74.                 prop.put("mail.smtp.socketFactory.port", emailConfig.getServerPort());  
  75.                 prop.put("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory");  
  76.             }  
  77.   
  78.             // 根据邮件会话属性和密码验证器构造一个发送邮件的session  
  79.             Session sendMailSession = Session.getDefaultInstance(prop, authenticator);  
  80.             sendMailSession.setDebug(false);  
  81.   
  82.             try {  
  83.                 // 根据session创建一个邮件消息  
  84.                 Message mailMessage = new MimeMessage(sendMailSession);  
  85.                 // 设置自定义发件人昵称  
  86.                 String nick = MimeUtility.encodeText("通通学");  
  87.                 // 创建邮件发送者地址  
  88.                 Address from = new InternetAddress(nick + " ");  
  89.                 // 设置邮件消息的发送者  
  90.                 mailMessage.setFrom(from);  
  91.                 // 创建邮件的接收者地址,并设置到邮件消息中  
  92.                 Address to = new InternetAddress(receiveAdd);  
  93.                 // Message.RecipientType.TO属性表示接收者的类型为TO  
  94.                 mailMessage.setRecipient(Message.RecipientType.TO, to);  
  95.                 // 设置邮件消息的主题  
  96.                 mailMessage.setSubject(emailContent.getSubject());  
  97.                 // 设置邮件消息发送的时间  
  98.                 mailMessage.setSentDate(new Date());  
  99.                 // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象  
  100.                 Multipart mainPart = new MimeMultipart();  
  101.                 // 创建一个包含HTML内容的MimeBodyPart  
  102.                 BodyPart html = new MimeBodyPart();  
  103.                 // 设置HTML内容  
  104.                 html.setContent(emailContent.getContent(), "text/html; charset=utf-8");  
  105.                 mainPart.addBodyPart(html);  
  106.                 // 将MiniMultipart对象设置为邮件内容  
  107.                 mailMessage.setContent(mainPart);  
  108.                 // 发送邮件  
  109.                 Transport.send(mailMessage);  
  110.             } catch (Exception e) {  
  111.                 e.printStackTrace();  
  112.             }  
  113.         }  
  114.     }  
  115. }  

 

Main.java

这是用于测试的类:

Java代码   收藏代码
  1. package com.tongtongxue.mail;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. /** 
  7.  * 用于测试发送邮件的类 
  8.  */  
  9. public class Main {  
  10.   
  11.     public static void main(String[] args) {  
  12.         // 初始化用于发送邮件的邮箱配置  
  13.         List emailConfigs = initEmailConfigs();  
  14.         // 初始化接收邮件的email地址  
  15.         List receiveAdds = initReceiveAdds();  
  16.         // 初始化邮件发送的内容  
  17.         EmailContent emailContent = initEmailContent();  
  18.   
  19.         // 初始化<a href="http://www.tongtongxue.com/tags/%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e5%99%a8" title="查看更多关于邮件发送器的文章" target="_blank">邮件发送器</a>  
  20.         EmailHelper emailHelper = new EmailHelper();  
  21.         emailHelper.sendMail(receiveAdds, emailConfigs, emailContent);  
  22.   
  23.         emailHelper.shutdown();  
  24.   
  25.     }  
  26.   
  27.     private static List initEmailConfigs() {  
  28.         List emailConfigs = new ArrayList();  
  29.         EmailConfig emailConfig01 = new EmailConfig();  
  30.         emailConfig01.setUsername("xxxxx@163.com");  
  31.         emailConfig01.setPassword("xxxxx");  
  32.         emailConfig01.setServerPort("25");  
  33.         emailConfig01.setSmtpHost("smtp.163.com");  
  34.         emailConfig01.setSSL(false);  
  35.         emailConfigs.add(emailConfig01);  
  36.   
  37.         EmailConfig emailConfig02 = new EmailConfig();  
  38.         emailConfig02.setUsername("xxxxx@yahoo.com");  
  39.         emailConfig02.setPassword("xxxxx");  
  40.         emailConfig02.setServerPort("465");  
  41.         emailConfig02.setSmtpHost("smtp.163.com");  
  42.         emailConfig02.setSSL(true);  
  43.         emailConfigs.add(emailConfig02);  
  44.   
  45.         return emailConfigs;  
  46.     }  
  47.   
  48.     private static List initReceiveAdds() {  
  49.         List receiveAdds = new ArrayList();  
  50.         receiveAdds.add("xxxxx@qq.com");  
  51.         receiveAdds.add("xxxxx@qq.com");  
  52.         receiveAdds.add("xxxxx@qq.com");  
  53.         return receiveAdds;  
  54.     }  
  55.   
  56.     private static EmailContent initEmailContent() {  
  57.         EmailContent emailContent = new EmailContent();  
  58.         emailContent.setSubject("测试邮件邮件");  
  59.         emailContent.setContent("<title>Test</title><h1>这是一封测试邮件。。。欢迎来到通通学,http://www.tongtongxue.com</h1>");  
  60.         return emailContent;  
  61.     }  
  62. }  

 

本文转载:通通学 - 知识学习与分享平台





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值