一、JavaMail的核心API

1、API功能图解

2、API说明

(1)、Message 类:
javax.mail.Message 类是创建和解析邮件的一个抽象类
子类javax.mail.internet.MimeMessage :表示一份电子邮件。
发送邮件时,首先创建出封装了邮件数据的 Message 对象, 然后把这个对象传递给邮件发送Transport 类,执行发送。
接收邮件时,把接收到的邮件数据封装在Message 类的实例中,从这个对象中解析收到的邮件数据。

(2)、Transport 类
javax.mail.Transport 类是发送邮件的核心API 类
创建好 Message 对象后, 只需要使用邮件发送API 得到 Transport 对象, 然后把 Message 对象传递给 Transport 对象, 并调用它的发送方法, 就可以把邮件发送给指定的邮件服务器。

(3)、Store 类
javax.mail.Store 类是接收邮件的核心 API 类
实例对象代表实现了某个邮件接收协议的邮件接收对象,接收邮件时, 只需要得到 Store 对象, 然后调用 Store 对象的接收方法,就可以从指定的邮件服务器获得邮件数据,并把这些邮件数据封装到表示邮件的 Message 对象中。

(4)、Session 类:
javax.mail.Session 类定义邮件服务器的主机名、端口号、协议等
Session 对象根据这些信息构建用于邮件收发的 Transport 和 Store 对象, 以及为客户端创建 Message 对象时提供信息支持。

二、邮件服务器配置

以 smtp 为例

1、smtp.mxhichina.com
阿里云企业邮箱配置(账号+密码)2、smtp.aliyun.com
阿里云个人邮箱配置(账号+密码)3、smtp.163.com
网易邮箱配置(账号+授权码)

三、公共代码块

1、邮件通用配置

package com.email.send.param;
/*** 邮箱发送参数配置*/
public class EmailParam {/*** 邮箱服务器地址*/// public static final String emailHost = "smtp.mxhichina.com" ; 阿里云企业邮箱配置(账号+密码)// public static final String emailHost = "smtp.aliyun.com" ; 阿里云个人邮箱配置(账号+密码)public static final String emailHost = "smtp.163.com" ; // 网易邮箱配置(账号+授权码)/*** 邮箱协议*/public static final String emailProtocol = "smtp" ;/*** 邮箱发件人*/public static final String emailSender = "xxxxxx@163.com" ;/*** 邮箱授权码*/public static final String password = "authCode";/*** 邮箱授权*/public static final String emailAuth = "true" ;/*** 邮箱昵称*/public static final String emailNick = "知了一笑" ;
}

2、常用常量

package com.email.send.param;
/*** 邮件发送类型*/
public enum EmailType {EMAIL_TEXT_KEY("email_text_key", "文本邮件"),EMAIL_IMAGE_KEY("email_image_key", "图片邮件"),EMAIL_FILE_KEY("email_file_key", "文件邮件");private String code;private String value;EmailType(String code, String value) {this.code = code;this.value = value;}public static String getByCode(String code) {EmailType[] values = EmailType.values();for (EmailType emailType: values) {if (emailType.code.equalsIgnoreCase(code)) {return emailType.value;}}return null;}// 省略 get set
}

四、邮件发送封装

1、纯文本邮件发送

(1)、代码封装

/*** 邮箱发送模式01:纯文本格式*/
public static void sendEmail01(String receiver, String title, String body) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host", EmailParam.emailHost);prop.setProperty("mail.transport.protocol", EmailParam.emailProtocol);prop.setProperty("mail.smtp.auth", EmailParam.emailAuth);//使用JavaMail发送邮件的5个步骤//1、创建sessionSession session = Session.getInstance(prop);//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2、通过session得到transport对象Transport ts = session.getTransport();//3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。ts.connect(EmailParam.emailHost, EmailParam.emailSender, EmailParam.password);//4、创建邮件// Message message = createEmail01(session,receiver,title,body);Message message = createEmail01(session, receiver, title, body);//5、发送邮件ts.sendMessage(message, message.getAllRecipients());ts.close();
}
/*** 创建文本邮件*/
private static MimeMessage createEmail01(Session session, String receiver, String title, String body)
throws Exception {//创建邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人String nick = javax.mail.internet.MimeUtility.encodeText(EmailParam.emailNick);message.setFrom(new InternetAddress(nick + "<" + EmailParam.emailSender + ">"));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));//邮件的标题message.setSubject(title);//邮件的文本内容message.setContent(body, "text/html;charset=UTF-8");//返回创建好的邮件对象return message;
}

(2)、执行效果图

2、文本+图片+附件邮件

(1)、代码封装

/*** 邮箱发送模式02:复杂格式*/
public static void sendEmail02(String receiver, String title, String body) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host", EmailParam.emailHost);prop.setProperty("mail.transport.protocol", EmailParam.emailProtocol);prop.setProperty("mail.smtp.auth", EmailParam.emailAuth);//使用JavaMail发送邮件的5个步骤//1、创建sessionSession session = Session.getInstance(prop);//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2、通过session得到transport对象Transport ts = session.getTransport();//3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。ts.connect(EmailParam.emailHost, EmailParam.emailSender, EmailParam.password);//4、创建邮件// Message message = createEmail01(session,receiver,title,body);Message message = createEmail02(session, receiver, title, body);//5、发送邮件ts.sendMessage(message, message.getAllRecipients());ts.close();
}
private static MimeMessage createEmail02(Session session, String receiver, String title, String body)
throws Exception {//创建邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人String nick = javax.mail.internet.MimeUtility.encodeText(EmailParam.emailNick);message.setFrom(new InternetAddress(nick + "<" + EmailParam.emailSender + ">"));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver));//邮件的标题message.setSubject(title);//文本内容MimeBodyPart text = new MimeBodyPart();text.setContent(body, "text/html;charset=UTF-8");//图片内容MimeBodyPart image = new MimeBodyPart();image.setDataHandler(new DataHandler(new FileDataSource("ware-email-send/src/gzh.jpg")));image.setContentID("gzh.jpg");//附件内容MimeBodyPart attach = new MimeBodyPart();DataHandler file = new DataHandler(new FileDataSource("ware-email-send/src/gzh.zip"));attach.setDataHandler(file);attach.setFileName(file.getName());//关系:正文和图片MimeMultipart multipart1 = new MimeMultipart();multipart1.addBodyPart(text);multipart1.addBodyPart(image);multipart1.setSubType("related");//关系:正文和附件MimeMultipart multipart2 = new MimeMultipart();multipart2.addBodyPart(attach);// 全文内容MimeBodyPart content = new MimeBodyPart();content.setContent(multipart1);multipart2.addBodyPart(content);multipart2.setSubType("mixed");// 封装 MimeMessage 对象message.setContent(multipart2);message.saveChanges();// 本地查看文件格式message.writeTo(new FileOutputStream("F:\\MixedMail.eml"));//返回创建好的邮件对象return message;
}

(2)、执行效果

3、实现异步发送

(1)、配置异步执行线程

package com.email.send.util;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/*** 定义异步任务执行线程池*/
@Configuration
public class TaskPoolConfig {@Bean("taskExecutor")public Executor taskExecutor () {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 核心线程数10:线程池创建时候初始化的线程数executor.setCorePoolSize(10);// 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setMaxPoolSize(15);// 缓冲队列200:用来缓冲执行任务的队列executor.setQueueCapacity(200);// 允许线程的空闲时间60秒:当超过了核心线程数之外的线程在空闲时间到达之后会被销毁executor.setKeepAliveSeconds(60);// 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池executor.setThreadNamePrefix("taskExecutor-");/*线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务*/executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Beanexecutor.setWaitForTasksToCompleteOnShutdown(true);// 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。executor.setAwaitTerminationSeconds(600);return executor;}
}

(2)、业务方法使用
注意两个注解
@Component
@Async(“taskExecutor”)

@Component
@Service
public class EmailServiceImpl implements EmailService {@Async("taskExecutor")@Overridepublic void sendEmail(String emailKey, SendEmailModel model) {try{// 异步执行Thread.sleep(1000);String textBody = EmailUtil.convertTextModel(BodyType.getByCode(emailKey),"知了","一笑");// 发送文本邮件EmailUtil.sendEmail01(model.getReceiver(), EmailType.getByCode(emailKey),textBody);// 发送复杂邮件:文本+图片+附件String body = "自定义图片:<img src='cid:gzh.jpg'/>,网络图片:<img src='http://pic37.nipic.com/20140113/8800276_184927469000_2.png'/>";// EmailUtil.sendEmail02(model.getReceiver(),"文本+图片+附件",body);} catch (Exception e){e.printStackTrace();}}
}

(3)、启动类注解
@EnableAsync

@EnableAsync
@SpringBootApplication
public class EmailApplication {public static void main(String[] args) {SpringApplication.run(EmailApplication.class,args) ;}
}

五、源代码地址

GitHub:知了一笑
https://github.com/cicadasmile/middle-ware-parent


SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件相关推荐

  1. flask-mail异步发送邮件_SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件

    一.JavaMail的核心API 1.API功能图解 2.API说明 (1).Message 类: javax.mail.Message 类是创建和解析邮件的一个抽象类子类javax.mail.int ...

  2. SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践

    作者 | sparrow 来源 | 阿里巴巴云原生公众号 本文来自 Arthas 2021 年 3 月征文投稿,4 月有奖征文参与方式可见文末. 项目最初使用 Arthas 主要有两个目的: 通过 a ...

  3. springboot 2.0.0.M7之 注解 与 配置

    spring boot 注解和配置 更多干货 spring-boot系列一 之restfull api与多环境配置 springboot系列二之 日志 SpringBoot系列三之 MVC 模版引擎 ...

  4. 基于springboot 2.0的项目种子

    做这个种子的心路历程 最近在做一个大型的J2EE项目,后端语言选择了Java,理所当然的选择了SpringBoot,使用SpringBoot来做restful风格的api开发很是方便,Spring下面 ...

  5. springboot2.0集成哨兵模式Redisson

    学习网站:https://my.oschina.net/u/3959468/blog/2251918 1.Redisson Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据 ...

  6. SpringBoot 2.x 集成 Redis

    SpringBoot 2.x 集成 Redis windows上搭建redis环境 添加依赖 此处redis客户端使用jedis. <!-- redis --> <dependenc ...

  7. springboot security 权限校验_十二、SpringBoot 优雅的集成Spring Security

    前言 至于什么是Spring security ,主要两个作用,用户认证和授权.即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面.有的用户有权限执行某一操作,而有的用户不能 ...

  8. springboot2.0集成activiti modeler

    项目采用Springboot 2.0.3.RELEASE版本以及activiti 5.22.0版本 在acitiviti官网下载完整包https://github.com/Activiti/Activ ...

  9. SpringBoot与Docker集成

    SpringBoot与Docker集成 许多人正在使用容器包装其Spring Boot应用程序,而构建容器并不是一件容易的事.这是Spring Boot应用程序开发人员的指南,容器对于开发人员而言并非 ...

最新文章

  1. 001_python单元测试
  2. java程序设计pdf下载_Java程序设计(迟立颖) PDF扫描版[21MB]
  3. 【关注】人类的智力是如何发展起来的?《自然》发布三大科学假说
  4. 类的笔记整理__7-10__
  5. matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...
  6. 【PC工具】图片批量添加水印工具,绿色免安装工具软件,妈妈再也不用担心我.....
  7. golang基础环境配置
  8. BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )
  9. SQL Server常用的系统存储过程应用实例(转)
  10. 【LeetCode笔记】剑指 Offer 67. 把字符串转换成整数 (Java、字符串)
  11. 金三银四,如何征服面试官,拿到Offer
  12. html radio 更换图片,html修改radio、checkbox样式
  13. html画布的作用,HTML的canvas标签作用
  14. 1.4-nginx启动脚本和配置文件
  15. 3G技术与UMTS网络-1
  16. ubuntu安装google chrome无法启动且打不开网站
  17. JavaDay14-球员管理项目
  18. 2008年的各国卫星导航系统比较(北斗、伽利略、GLONASS、GPS)
  19. 青岛大学计算机科学学院,青岛大学信息工程学院
  20. java heap 参数_java heap space解决方法和JVM参数设置--- JVM参数设置和程序优化篇

热门文章

  1. 【线性代数本质】2:线性组合和线性相关和线性无关以及张成的空间
  2. PyQt5学习笔记02----初探Qt Designer 设计师
  3. poj3187 穷竭搜索 挑战程序设计大赛
  4. 判断mac地址单播还是组播(shell脚本)
  5. CVE-2020-1472 域内提权利用(域提权)
  6. 挖矿病毒解决实例(隐藏进程,文章较好)(入侵)
  7. 防火墙和路由器的滑铁卢:NAT Slipstreaming攻击
  8. Ubuntu设置开机启动
  9. python3+requests:get、post请求(python get、post)
  10. 八、栈的操作、栈空间