SpringBoot发送异步邮件流程与实现详解

 更新时间:2024年01月04日 09:10:10   作者:Splaying  
这篇文章主要介绍了SpringBoot发送异步邮件流程与实现详解,Servlet阶段邮件发送非常的复杂,如果现代化的Java开发是那个样子该有多糟糕,现在SpringBoot中集成好了邮件发送的东西,而且操作十分简单容易上手,需要的朋友可以参考下

1、基本简介

  • Servlet阶段邮件发送非常的复杂,如果现代化的Java开发是那个样子该有多糟糕;现在SpringBoot中集成好了邮件发送的东西,而且操作十分简单容易上手。
  • 发送邮件最主要的一步是需要去对应的邮箱开启POP3/SMTP 或者 IMAP/SMTP,并且拿到授权码!
  • 导入依赖包spring-boot-starter-mail。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2、邮件发送流程

首先导入mail的依赖包之后,根据SpringBoot的自动装配原理。几乎所有的Bean对象都给装配好了,直接拿来可以使用。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)	
@EnableConfigurationProperties(MailProperties.class)			//配置文件绑定
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {

	static class MailSenderCondition extends AnyNestedCondition {

		MailSenderCondition() {
			super(ConfigurationPhase.PARSE_CONFIGURATION);
		}
		// 配置文件前缀名称
		@ConditionalOnProperty(prefix = "spring.mail", name = "host")
		static class HostProperty {

		}

		@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
		static class JndiNameProperty {

		}
	}
}

简单分析一手可以看到只需要配置一下application文件即可,前缀以spring.mail开头;

spring:
  mail:
    username: xxxx@163.com
    password: 授权码
    host: smtp.163.com				# 不同邮箱对应的服务器不一样
    default-encoding: UTF-8
    
#    username: xxxx@qq.com
#    password: 授权码
#    host: smtp.qq.com

3、配置线程池

这个步骤不是必须的,但是使用异步的邮件建议还是配置一下。

@Configuration
@EnableAsync//开启异步
public class ThreadPoolConfig {

    @Bean("threadPool")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(5);
        // 设置最大线程数
        executor.setMaxPoolSize(10);
        // 设置队列容量
        executor.setQueueCapacity(100);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("Thread-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}

4、编写邮件工具类

  • 邮件在SpringBoot中被封装成简单纯文本邮件、多媒体邮件两种形式。
  • 针对上述两种形式的邮件可以进行编写一个工具类便于操作使用。
public class EmailUtil {

    private static final String content = "这是邮件的主内容";
	
	// 纯文本邮件
    public static SimpleMailMessage simple(String from, String to){
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject("欢迎xxx");
        message.setText(content);
        return message;
    }

	// 多媒体邮件
    public static MimeMessage mimeMessage(MimeMessage message,String from, String to) throws MessagingException {
        MimeMessageHelper helper = new MimeMessageHelper(message,true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject("复杂邮件主题");
        helper.setText("<p style='color: deepskyblue'>这是浅蓝色的文字</p>", true);
        helper.addAttachment("1.docx", new File("C:\\Users\\Splay\\Desktop\\说明书.docx"));
        helper.addAttachment("1.pdf", new File("C:\\Users\\Splay\\Desktop\\参考.pdf"));
        return message;
    }
}

5、邮件发送

邮件发送是需要时间的,因此为了不让用户等待的时间过长建议这里使用异步的形式发送。避免阻塞

@Service
public class SendEmailService {

	// SpringBoot自动装配的邮件发送实现类
    @Autowired
    JavaMailSenderImpl mailSender;

    @Async("threadPool")
    public void sendSimpleMail(String from, String to) {
        SimpleMailMessage message = EmailUtil.simple(from, to);
        mailSender.send(message);                   //简单纯文本邮件发送
    }

    @Async("threadPool")
    public void sendMultiPartMail(String from, String to) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessage mimeMessage = EmailUtil.mimeMessage(message,from, to);
        mailSender.send(mimeMessage);               //复杂邮件发送
    }

}

6、编写controller

编写几个controller进行测试

@Controller
public class RouterController {

    @Value("${spring.mail.username}")
    private String from;


    @Autowired
    SendEmailService mail;

    @RequestMapping("/simple")
    @ResponseBody
    public String simpleMail(@RequestParam(required = true,name = "mail",defaultValue = "xxx@qq.com") String to) {
        mail.sendSimpleMail(from, to);
        return "Send SimpleEmail Successful!";
    }

    @RequestMapping("/complex")
    @ResponseBody
    public String complexMail(@RequestParam(required = true,name = "mail",defaultValue = "xxx@qq.com") String to) throws MessagingException {
        mail.sendMultiPartMail(from, to);
        return "Send SimpleEmail Successful!";
    }
}

到此这篇关于SpringBoot发送异步邮件流程与实现详解的文章就介绍到这了,更多相关SpringBoot发送异步邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇文章带你搞定JAVA注解

    一篇文章带你搞定JAVA注解

    这篇文章主要介绍了详解Java注解的实现与使用方法的相关资料,希望通过本文大家能够理解掌握Java注解的知识,需要的朋友可以参考下
    2021-07-07
  • springboot 正确的在异步线程中使用request的示例代码

    springboot 正确的在异步线程中使用request的示例代码

    这篇文章主要介绍了springboot中如何正确的在异步线程中使用request,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  •  Spring 中 Bean 的生命周期详解

     Spring 中 Bean 的生命周期详解

    这篇文章主要介绍了Spring中Bean的生命周期详解,Java中的公共类称之为Bean或Java Bean,而Spring中的Bean指的是将对象的生命周期
    2022-09-09
  • Java开发之内部类对象的创建及hook机制分析

    Java开发之内部类对象的创建及hook机制分析

    这篇文章主要介绍了Java开发之内部类对象的创建及hook机制,结合实例形式分析了java基于hook机制内部类对象的创建与使用,需要的朋友可以参考下
    2018-01-01
  • SpringBoot常见错误图文总结

    SpringBoot常见错误图文总结

    最近在使用idea+Springboot开发项目中遇到一些问题,这篇文章主要给大家介绍了关于SpringBoot常见错误总结的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • java代码实现MD5加密及验证过程详解

    java代码实现MD5加密及验证过程详解

    这篇文章主要介绍了java代码实现MD5加密及验证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Idea安装bpmn插件actiBPM的详细过程(解决高版本无法安装actiBPM插件)

    Idea安装bpmn插件actiBPM的详细过程(解决高版本无法安装actiBPM插件)

    这篇文章主要介绍了Idea安装bpmn插件actiBPM的详细过程(解决高版本无法安装actiBPM插件)的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 微服务链路追踪Spring Cloud Sleuth整合Zipkin解析

    微服务链路追踪Spring Cloud Sleuth整合Zipkin解析

    这篇文章主要为大家介绍了微服务链路追踪Spring Cloud Sleuth整合Zipkin解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 实例化JFileChooser对象报空指针异常问题的解决办法

    实例化JFileChooser对象报空指针异常问题的解决办法

    今天小编就为大家分享一篇关于实例化JFileChooser对象报空指针异常问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 详解spring cloud分布式整合zipkin的链路跟踪

    详解spring cloud分布式整合zipkin的链路跟踪

    这篇文章主要介绍了详解spring cloud分布式整合zipkin的链路跟踪,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07

最新评论