邮件发送器

/**
* 邮件发送器
*
* @author Zebe
*/
public class MailSender implements Runnable { /**
* 收件人
*/
private String to; /**
* 收件人名称
*/
private String toName; /**
* 主题
*/
private String subject; /**
* 内容
*/
private String content; /**
* 附件列表
*/
private List<String> attachFileList; /**
* 构造器
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
public MailSender(String to,String toName, String subject, String content) {
this.to = to;
this.toName = toName;
this.subject = subject;
this.content = content;
} /**
* 构造器
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param attachFileList 附件列表
*/
public MailSender(String to, String toName,String subject, String content, List<String> attachFileList) {
this(to, toName, subject, content);
this.attachFileList = attachFileList;
} @Override
public void run() {
new SendEmailUtil(to,toName, subject, content, attachFileList).send();
} }

邮件发送线程池

/**
* 邮件发送线程池
*
* @author Zebe
*/
public class MailSenderPool { /**
* 邮件发送器线程数量
*/
private static int SENDER_TOTAL = 10; /**
* 线程工厂(生产环境中建议使用带命名参数的线程工厂)
*/
private static ThreadFactory threadFactory = Executors.defaultThreadFactory(); /**
* 线程池执行器(采用了Spring提供的CustomizableThreadFactory,如果不需要请使用默认线程工厂)
*/
private static ExecutorService executor = new ThreadPoolExecutor(SENDER_TOTAL, 200,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), threadFactory,
new ThreadPoolExecutor.AbortPolicy()); /**
* 内部静态实例
*/
private static class Inner {
private static MailSenderPool instance = new MailSenderPool();
} /**
* 获取实例
*
* @return 返回邮件发送线程池实例
*/
public static MailSenderPool getInstance() {
return Inner.instance;
} /**
* 通过线程发送
*
* @param sender 邮件发送器
* @return 返回自身
*/
public MailSenderPool sendByThread(MailSender sender) {
executor.execute(sender);
return getInstance();
} /**
* 关闭线程池
*/
public void shutDown() {
executor.shutdown();
} }

邮件发送工具类

/**
* 邮件发送工具类。
* 以下邮件中的配置参数,请在实际环境中,根据需要采取合适的配置方式。
* 发送邮件依赖 com.sun.mail(1.6.1) 包、javax.mail(1.5.0-b01) 包。
* 如果使用 Idea 运行,请将这两个包(可以直接到Maven目录下面去找)添加到项目的 Libraries 里面(快捷键:Ctrl + Alt + Shift + S)
*
* @author Zebe
*/
public class SendEmailUtil { /**
* 发件人别名(可以为空)
*/
private final static String fromAliasName = "****"; /**
* 登录用户名
*/
private String ACCOUNT; /**
* 登录密码
*/
private String PASSWORD; /**
* 邮件服务器地址
*/
//QQ企业邮箱:smtp.exmail.qq.com
//网易企业邮箱:smtphz.qiye.163.com
private String HOST; /**
* 发信端口
*/
//QQ企业邮箱:465
//网易企业邮箱:994
private String PORT; /**
* 发信协议
*/
private final static String PROTOCOL = "ssl"; /**
* 收件人
*/
private String to; /**
* 收件人名称
*/
private String toName; /**
* 主题
*/
private String subject; /**
* 内容
*/
private String content; /**
* 附件列表(可以为空)
*/
private List<String> attachFileList; /**
* 构造器
*
* @param attachFileList 附件列表
*/
public SendEmailUtil(MailTemplate mailTemplate, List<String> attachFileList) {
this.to = mailTemplate.getTo();
this.toName = mailTemplate.getToName();
this.subject = mailTemplate.getSubject();
this.content = mailTemplate.getContent();
this.attachFileList = attachFileList;
this.ACCOUNT = mailTemplate.getAccount();
this.PASSWORD = mailTemplate.getPassword();
switch (mailTemplate.getSendType()) {
case "qq":
this.HOST = "smtp.exmail.qq.com";
this.PORT = "465";
break;
case "163":
this.HOST = "smtp.ym.163.com";
this.PORT = "994";
break;
}
} /**
* 认证信息
*/
static class MyAuthenticator extends Authenticator { /**
* 用户名
*/
String username = null; /**
* 密码
*/
String password = null; /**
* 构造器
*
* @param username 用户名
* @param password 密码
*/
public MyAuthenticator(String username, String password) {
this.username = username;
this.password = password;
} @Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
} /**
* 发送邮件
*/
public boolean send() {
// 设置邮件属性
Properties prop = new Properties();
prop.setProperty("mail.transport.protocol", PROTOCOL);
prop.setProperty("mail.smtp.host", HOST);
prop.setProperty("mail.smtp.port", PORT);
prop.setProperty("mail.smtp.auth", "true");
MailSSLSocketFactory sslSocketFactory = null;
try {
sslSocketFactory = new MailSSLSocketFactory();
sslSocketFactory.setTrustAllHosts(true);
} catch (GeneralSecurityException e1) {
e1.printStackTrace();
}
if (sslSocketFactory == null) {
System.err.println("开启 MailSSLSocketFactory 失败");
} else {
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sslSocketFactory);
// 创建邮件会话(注意,如果要在一个进程中切换多个邮箱账号发信,应该用 Session.getInstance)
Session session = Session.getDefaultInstance(prop, new MyAuthenticator(ACCOUNT, PASSWORD));
// 开启调试模式(生产环境中请不要开启此项)
session.setDebug(true);
try {
MimeMessage mimeMessage = new MimeMessage(session);
// 设置发件人别名(如果未设置别名就默认为发件人邮箱)
mimeMessage.setFrom(new InternetAddress(ACCOUNT, fromAliasName));
// 设置主题和收件人、发信时间等信息
mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to, toName));
mimeMessage.setSubject(subject);
mimeMessage.setSentDate(new Date()); //图片
MimeBodyPart img = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src/main/resources/2.jpg"));//图片路径
img.setDataHandler(dh);
img.setContentID("img");
//正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("这里正文内容 for img<img src='cid:img'><br/>", "text/html;charset=utf-8"); //注意编码问题 //描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(img);
mm.setSubType("related"); //图片-文本--复合--转普通节点
MimeBodyPart tex_image_tPart=new MimeBodyPart();
tex_image_tPart.setContent(mm); // 如果有附件信息,则添加附件
if (!attachFileList.isEmpty()) {
Multipart multipart = new MimeMultipart();
MimeBodyPart body = new MimeBodyPart();
body.setContent(content, "text/html; charset=UTF-8");
multipart.addBodyPart(body);
// 添加所有附件(添加时判断文件是否存在)
for (String filePath : attachFileList) {
if (Files.exists(Paths.get(filePath))) {
MimeBodyPart tempBodyPart = new MimeBodyPart();
tempBodyPart.attachFile(filePath);
multipart.addBodyPart(tempBodyPart);
}
}
mimeMessage.setContent(multipart);
} else {
// Multipart multipart = new MimeMultipart();
// MimeBodyPart body = new MimeBodyPart();
// body.setContent(mm, "text/html; charset=UTF-8");
// multipart.addBodyPart(body);
MimeMultipart mimeMultipart1=new MimeMultipart();
mimeMultipart1.addBodyPart(tex_image_tPart);
mimeMultipart1.setSubType("mixd");//混合关系
mimeMessage.setContent(mimeMultipart1, "text/html; charset=UTF-8");
//mimeMessage.setText(content);
}
// 开始发信
mimeMessage.saveChanges();
Transport.send(mimeMessage);
return true;
} catch (MessagingException | IOException e) {
e.printStackTrace();
return false;
}
}
return false;
}
}

示例

    public static void main(String[] args) {
try {
int num;
// 通过线程池发送邮件
MailSenderPool pool = MailSenderPool.getInstance();
for (num=1;num<=73;num++){
// 设置发信参数
final String toName = "我是" + num + "号";
final String to = "test" + num + "@***.com";
String subject = num + " 第一次发送测试邮件标题";
final String content = "<p style='color:red'>这是邮件内容正文。</p>";
// 设置附件路径(注意:res 是项目根目录下的一个文件夹)
// final List<String> attachFileList = Arrays.asList("res/1.png", "res/1.pdf");
pool.sendByThread(new MailSender(to,toName, subject, content, new ArrayList<>()));
subject = num + " 第二次发送测试邮件标题";
pool.sendByThread(new MailSender(to,toName, subject, content, new ArrayList<>()));
}
pool.shutDown();
}catch (Exception e){
System.out.println("错误: " + e);
}
}
												

【Java】JavaMail使用网易企业邮箱发邮件的更多相关文章

  1. C# 用QQ企业邮箱发邮件

    问题System.Net.Mail下的SmtpClient来发送邮件,而System.Net.Mail only仅支持Explicit SSL 不要465端口,用25,不用EnableSsl = tr ...

  2. Java实现网易企业邮箱发送邮件

    最近项目需要用网易企业邮箱发送邮件,特意来将实现过程记录一下: maven导入jar包 <!-- javax.mai 核心包 --> <dependency> <grou ...

  3. Apache Commons Email 使用网易企业邮箱发送邮件

    最近使用HtmlEmail 发送邮件,使用网易企业邮箱,发送邮件,死活发不出去!原以为是网易企业邮箱,不支持发送邮箱,后面经过研究发现,是apache htmlEmail 的协议导致,apache E ...

  4. win10自带邮箱添加网易企业邮箱

    开始-邮件-账户-添加账户-高级安装程序-internet电子邮件-然后输入网易企业邮箱的用户名和相关服务器设置就行了 接收服务器 pop.qiye.163.com发送服务器 smtp.qiye.16 ...

  5. MVC4/5+jquery+bootstrap样式+dataTables+linq+WCF+EF6后台和前台的框架集合!好蛋疼哦!数据库支持MYSQL 和MSSQL,oracle。集成腾讯企业邮箱收邮件同步用户SSO登陆等功能。

    花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才做出来,下个项目准备用这个框架! 大家有没有做这方面的可以交流一下! 花费了我好多心血,才 ...

  6. python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式

    配置文件:UiObjectMapSendMap.ini用来存放配置信息 GetOptionSendMail.py 用来读取配信息 #encoding=utf-8from selenium.webdri ...

  7. Foxmail登录不了网易企业邮箱解决办法

    关于Foxmail登录不了网易企业邮箱问题 解决办法是:在设置账号的时候手动设置pop服务器和smtp服务器. 新建账号的图: 点击“手动设置”出现如下界面: 设置完成后问题解决.下面的两个是正确的, ...

  8. mailx加163邮箱发邮件

    mailx加163邮箱发邮件 参考:https://www.cnblogs.com/myvic/p/9579954.html 配置 $ yum install mailx -y $ vim /etc/ ...

  9. javamail腾讯企业邮箱发送邮件

    此代码用的jar文件:mail.jar(1.4.5版本); 如果jdk用的是1.8版本会出现SSL错误:这个问题是jdk导致的,jdk1.8里面有一个jce的包,安全性机制导致的访问https会报错, ...

随机推荐

  1. 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)

    ubuntu更新软件时 apt-get upgrade 遇到 E: 无法获得锁 /: 资源暂时不可用) E: Unable to acquire the dpkg frontend lock (/va ...

  2. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  3. [转帖]Windows下cwRsyncServer双机连续同步部署

    Windows下cwRsyncServer双机连续同步部署 https://www.cnblogs.com/nulige/p/7607503.html 找时间做一下测试 应该能更好的实现 自动部署的功 ...

  4. mysql中的范式

    范式 范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余.范 ...

  5. spring boot @Transactional的一个小坑

    同一个类Service下,有两个函数 method_1和 method_2,且method_1内部调用了method_2,那么希望method_2内部意外时,数据库回滚,那么一定要在method_1上 ...

  6. Scrapy 教程(七)-架构与中间件

    Scrapy 使用 Twisted 这个异步框架来处理网络通信,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求. Scrapy 架构 其实之前的教程都有涉及,这里再做个系统介绍 Engin ...

  7. Spring aop 实例(转)

    面向切面编程,有效的降低了代码之间的耦合性,易于维护:例如:我们习惯在代码中加上一些日志信息,在程序出错时方便快速查找找到问题,通常做法是在请求进入方法的时候打印日志,退出前打印日志,还有在出错时打印 ...

  8. Dire Wolf——HDU5115(区间DP)

    题意 就是有一对狼,每个狼有初始的攻击力,并且还能给左右两边的狼提供攻击力加成,当冒险家杀死一头狼的时候他也会受到这个狼目前攻击力的伤害 实例解析 33 5 78 2 0 有三头狼,刚开始第二头狼给他 ...

  9. 剑指offer-平衡二叉树-python

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 思路: 平衡二叉树 (AVL)平衡二叉树是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1.它是一种高度平衡的二叉排序树.意思是 ...

  10. ETL工具Kettle使用以及与Java整合实现数据清洗

    本文主要讲述kettle的使用和与Java整合,具体下载与安装请自行百度! kettle有两种脚本方式:转换和工作,工作中可以添加转换.以下以转换为例. 1.新建一个转换, 2.在工作中经常用到的是表 ...