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


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

EmailConfig.java

这是发信邮件的配置类:

package com.tongtongxue.mail;public class EmailConfig {private String username;private String password;private String smtpHost;private String serverPort;private boolean isSSL;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSmtpHost() {return smtpHost;}public void setSmtpHost(String smtpHost) {this.smtpHost = smtpHost;}public String getServerPort() {return serverPort;}public void setServerPort(String serverPort) {this.serverPort = serverPort;}public boolean isSSL() {return isSSL;}public void setSSL(boolean isSSL) {this.isSSL = isSSL;}
}

EmailContent.java

这是邮件内容的封装类:

package com.tongtongxue.mail;public class EmailContent {private String subject;private String content;public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

EmailAuthenticator.java

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

package com.tongtongxue.mail;import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;public class EmailAuthenticator extends Authenticator {private String username;private String password;public EmailAuthenticator() {}public EmailAuthenticator(String username, String password) {this.username = username;this.password = password;}@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}
}

RandomUtil.java

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

package com.tongtongxue.mail;import java.util.Random;public class RandomUtil {public static int getRandomInt(int size) {Random random = new Random();return random.nextInt(size);}
}

EmailHelper.java

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

package com.tongtongxue.mail;import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
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;public class EmailHelper {private ExecutorService executorService;public EmailHelper() {// 默认启动线程个数为10的线程池executorService = Executors.newFixedThreadPool(10);}public EmailHelper(int num) {// 指定初始化线程个数为num的线程池executorService = Executors.newFixedThreadPool(num);}public void sendMail(List receiveAdds, List emailConfigs, EmailContent emailContent) {// 用于发送邮件的邮箱配置个数int size = emailConfigs.size();// 循环待发送的邮箱地址for (String receiveAdd : receiveAdds) {// 随机获取一个用于发送邮件的邮箱配置EmailConfig emailConfig = emailConfigs.get(RandomUtil.getRandomInt(size));executorService.execute(new EmailItem(emailConfig, emailContent, receiveAdd));}}public void shutdown() {executorService.shutdown();}/*** 这个内部类,是真正用于发送邮件*/class EmailItem implements Runnable {private EmailConfig emailConfig;private EmailContent emailContent;private String receiveAdd;public EmailItem(EmailConfig emailConfig, EmailContent emailContent, String receiveAdd) {this.emailConfig = emailConfig;this.emailContent = emailContent;this.receiveAdd = receiveAdd;}@Overridepublic void run() {Properties prop = new Properties();prop.put("mail.smtp.host", emailConfig.getSmtpHost());prop.put("mail.smtp.port", emailConfig.getServerPort());prop.put("mail.smtp.auth", "true");String username = emailConfig.getUsername();EmailAuthenticator authenticator = new EmailAuthenticator(username, emailConfig.getPassword());// 如果需要ssl来发送邮件,则if (emailConfig.isSSL()) {prop.put("mail.smtp.socketFactory.port", emailConfig.getServerPort());prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");}// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession sendMailSession = Session.getDefaultInstance(prop, authenticator);sendMailSession.setDebug(false);try {// 根据session创建一个邮件消息Message mailMessage = new MimeMessage(sendMailSession);// 设置自定义发件人昵称String nick = MimeUtility.encodeText("通通学");// 创建邮件发送者地址Address from = new InternetAddress(nick + " ");// 设置邮件消息的发送者mailMessage.setFrom(from);// 创建邮件的接收者地址,并设置到邮件消息中Address to = new InternetAddress(receiveAdd);// Message.RecipientType.TO属性表示接收者的类型为TOmailMessage.setRecipient(Message.RecipientType.TO, to);// 设置邮件消息的主题mailMessage.setSubject(emailContent.getSubject());// 设置邮件消息发送的时间mailMessage.setSentDate(new Date());// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();// 创建一个包含HTML内容的MimeBodyPartBodyPart html = new MimeBodyPart();// 设置HTML内容html.setContent(emailContent.getContent(), "text/html; charset=utf-8");mainPart.addBodyPart(html);// 将MiniMultipart对象设置为邮件内容mailMessage.setContent(mainPart);// 发送邮件Transport.send(mailMessage);} catch (Exception e) {e.printStackTrace();}}}
}

Main.java

这是用于测试的类:

package com.tongtongxue.mail;import java.util.ArrayList;
import java.util.List;/*** 用于测试发送邮件的类*/
public class Main {public static void main(String[] args) {// 初始化用于发送邮件的邮箱配置List emailConfigs = initEmailConfigs();// 初始化接收邮件的email地址List receiveAdds = initReceiveAdds();// 初始化邮件发送的内容EmailContent emailContent = initEmailContent();// 初始化<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>EmailHelper emailHelper = new EmailHelper();emailHelper.sendMail(receiveAdds, emailConfigs, emailContent);emailHelper.shutdown();}private static List initEmailConfigs() {List emailConfigs = new ArrayList();EmailConfig emailConfig01 = new EmailConfig();emailConfig01.setUsername("xxxxx@163.com");emailConfig01.setPassword("xxxxx");emailConfig01.setServerPort("25");emailConfig01.setSmtpHost("smtp.163.com");emailConfig01.setSSL(false);emailConfigs.add(emailConfig01);EmailConfig emailConfig02 = new EmailConfig();emailConfig02.setUsername("xxxxx@yahoo.com");emailConfig02.setPassword("xxxxx");emailConfig02.setServerPort("465");emailConfig02.setSmtpHost("smtp.163.com");emailConfig02.setSSL(true);emailConfigs.add(emailConfig02);return emailConfigs;}private static List initReceiveAdds() {List receiveAdds = new ArrayList();receiveAdds.add("xxxxx@qq.com");receiveAdds.add("xxxxx@qq.com");receiveAdds.add("xxxxx@qq.com");return receiveAdds;}private static EmailContent initEmailContent() {EmailContent emailContent = new EmailContent();emailContent.setSubject("测试邮件邮件");emailContent.setContent("<title>Test</title><h1>这是一封测试邮件。。。欢迎来到通通学,http://www.tongtongxue.com</h1>");return emailContent;}
}

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

转载链接:http://www.tongtongxue.com/archives/282.html

动手写批量邮件发送器相关推荐

  1. 太实用了!自己动手写软件——邮件用户名密码验证

    我们计划实现的弱口令破解软件一共支持如下四类协议的解析: 数据库类--MySQL.Oracle和SQL server 邮件类--IMAP.POP3和SMTP 文件传输类--FTP 运维类--SSH 数 ...

  2. 自己动手写工具:百度图片批量下载器

    开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了 ...

  3. 自己动手写邮件客户端(1)

    自己动手写邮件客户端(1) --命令行测试发邮件 参考 RFC中文 环境 系统: win10 语言: java 简要流程 建立一个到邮件服务器的连接(在此使用smtp.163.com:25) Sock ...

  4. 80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 瑶池阿母绮窗开,黄竹歌声动地哀. ...

  5. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  6. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

  7. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  8. CowNew开源团队新书《自己动手写开发工具》隆重上市

    <自己动手写开发工具--基于Eclipse的工具开发> 本书系统地介绍了SWT.Draw2D.GEF.JET等与Eclipse插件开发相关的基础知识,并且以实际的开发案例来演示这些知识的实 ...

  9. 《自己动手写Docker》书摘之三: Linux UnionFS

    UnionFS UnionFS是一种为Linux,FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务.它使用branch把不同文件系统的文件和目录"透 ...

最新文章

  1. 重学算法第三期|数据结构与算法001
  2. 企业级实战03_真实项目实战SpringMVC整合ActiveMQ
  3. 人人都能看懂的 6 种限流实现方案!
  4. python基础字符串(二)
  5. SpringMVC系列(十六)Spring MVC与Struts2的对比
  6. 点击一下,即可在 Windows 10 实现路过式远程代码执行,未修复
  7. 经典排序算法(十六)--珠排序Bead Sort
  8. Codeforces Beta Round #61 (Div. 2)
  9. B站后台源码疑似泄露,作为程序员我们得注意哪些?
  10. 最新稳定短视频去水印免费解析API接口分享
  11. ASF/WMV 文件格式解析
  12. CATIA二次开发过程中几个问题
  13. Python float基本用法
  14. 计算机中cpu是不是内存,电脑卡是cpu还是内存
  15. Unity初学:制作2D小游戏Sunny Land 1.游戏背景场景添加
  16. Citrix联机插件配置管理器:找不到满足所有锁定要求的值
  17. 159 至多包含两个不同字符的最长子串
  18. 献给初学者的Java学习方法完整版(附教程)
  19. 计算机网络之应用层(文件传送协议、万维网)
  20. java基础火车站售票(线程安全)

热门文章

  1. vue项目中实现用户登录以及token验证
  2. python使用kafka原理详解_Python操作Kafka原理及使用详解
  3. Elasticsearch 中为什么会有大量文档插入后变成 deleted?
  4. i7 11700kf对比i710700kf 差距大不大
  5. Java生成随机字符串
  6. 离子膜电解槽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. 实体类或对象序列化时,忽略为空属性
  8. 奇龙公关解析危机公关为何这般重要?
  9. 顺时针旋转矩阵的两种方法
  10. python 通过 Flask 实现 接口demo