文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot2 高级应用(02):集成 JavaMail ,实现异步发送邮件

2023-06-02 13:13

关注

本文源码:GitHub·点这里 || GitEE·点这里

一、JavaMail的核心API

1、API功能图解

SpringBoot2 高级应用(02):集成 JavaMail ,实现异步发送邮件

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)、代码封装

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、创建session    Session 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)、执行效果图

SpringBoot2 高级应用(02):集成 JavaMail ,实现异步发送邮件

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

(1)、代码封装

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、创建session    Session 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)、执行效果

SpringBoot2 高级应用(02):集成 JavaMail ,实现异步发送邮件

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;@Configurationpublic 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-");                executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean        executor.setWaitForTasksToCompleteOnShutdown(true);        // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。        executor.setAwaitTerminationSeconds(600);        return executor;    }}

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

@Component@Servicepublic class EmailServiceImpl implements EmailService {    @Async("taskExecutor")    @Override    public 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@SpringBootApplicationpublic class EmailApplication {    public static void main(String[] args) {        SpringApplication.run(EmailApplication.class,args) ;    }}

五、源代码地址

GitHub·地址https://github.com/cicadasmile/middle-ware-parentGitEE·地址https://gitee.com/cicadasmile/middle-ware-parent

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯