简单易懂 spirngboot 异步发送邮件

引用依赖包到 pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置文件

163邮箱配置

spring.mail.host=smtp.163.com #邮箱服务器地址 
spring.mail.username=xxx.163.com #用户名 
spring.mail.password=ooo #开启POP3之后设置的客户端授权码 
spring.mail.default-encoding=UTF-8 #编码 
##超时可选
spring.mail.properties.mail.smtp.connectiontimeout=5000 
spring.mail.properties.mail.smtp.timeout=3000 
spring.mail.properties.mail.smtp.writetimeout=5000

注意

1、这里的password不是登录密码,是开启POP3之后设置的客户端授权码 
2、 默认端口25,使用465端口时,需要添加配置: 
spring.mail.port=465 
spring.mail.properties.mail.smtp.ssl.enable=true

pop3 授权码开启参考: https://jingyan.baidu.com/article/ac6a9a5e13035e2b653eac26.html
qq邮箱配置

spring.mail.host=smtp.qq.com 
spring.mail.username=xxx@qq.com 
spring.mail.password=ooo #开启POP3之后设置的客户端授权码 
spring.mail.default-encoding=UTF-8

本文使用163邮箱配置如下供参考:

spring:
  email:
    host: smtp.163.com
    username: xxxxx@163.com
    # 163邮箱密码 修改为授权码
    password: xxxxxxxxxxx
    auth: true
    enable: true
    required: true
    port: 25
    defaultEncoding: UTF-8

注入配置信息,新建EmailConfigEntity类和 EmailConfig 类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "spring.email")
public class EmailConfigEntity {
    private String host;
    private String username;
    private String password;
    private String auth;
    private String enable;
    private String required;
    private int port;
    private String defaultEncoding;
}

EmailConfig 类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
/*@EnableConfigurationProperties(EmailConfigEntity.class)*/
public class EmailConfig {
    @Autowired
    private EmailConfigEntity entity;
    //获取JavaMailSenderImpl 对象
    @Bean
    public JavaMailSenderImpl JavaMailSender(){
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(entity.getHost().trim());
        sender.setUsername(entity.getUsername().trim());
        sender.setPassword(entity.getPassword().trim());
        sender.setPort(entity.getPort());
        sender.setProtocol("smtp");
        sender.setDefaultEncoding(entity.getDefaultEncoding());

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", entity.getAuth().trim());
        properties.setProperty("mail.smtp.starttls.enable", entity.getEnable().trim());
        properties.setProperty("mail.smtp.starttls.required", entity.getRequired().trim());
        sender.setJavaMailProperties(properties);
        return sender;
    }

    // 实列化 email 工具
    @Bean
    public EmailUtil getEmailUtil(){
        EmailUtil emailUtil = new EmailUtil();
        emailUtil.setSender(JavaMailSender());
        return emailUtil;
    }

}

EmailBean 实体类

import lombok.Data;
import org.springframework.core.io.FileSystemResource;
@Data
public class EmailBean {
    // 发送人
    private String from;
    // 接收人
    private String to;
    // 主题
    private String subject;
    // 内容
    private String text;
    // 附件
    private FileSystemResource file;
    // 附件名称
    private String attachmentFilename;
    // 邮件类型
    private Integer type;
    
}

封装邮件发送类型工具类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;

import javax.mail.internet.MimeMessage;
public class EmailUtil {
    // 日志记录
    private final static Logger logger = LoggerFactory.getLogger(EmailUtil.class);

    private JavaMailSenderImpl sender;

    public JavaMailSenderImpl getSender() {
        return sender;
    }
    public void setSender(JavaMailSenderImpl sender) {
        this.sender = sender;
    }
    public void send(EmailBean bean){
        try{
            // 异步执行
            Thread.sleep(1000);
            switch(bean.getType()){
                case 1:
                    // 简单文本邮件
                    SimpleMailMessage text = new SimpleMailMessage();
                    text.setFrom(bean.getFrom());
                    text.setTo(bean.getTo());
                    text.setSubject(bean.getSubject());
                    // 简单文本核心代码
                    text.setText(bean.getText());

                    sender.send(text);
                    break;
                case 2:
                    // HTML邮件
                    MimeMessage html = sender.createMimeMessage();
                    MimeMessageHelper helper = new MimeMessageHelper(html, true);
                    helper.setFrom(bean.getFrom());
                    helper.setTo(bean.getTo());
                    helper.setSubject(bean.getSubject());
                    // HTML 核心代码
                    helper.setText(bean.getText(),true);

                    sender.send(html);
                    break;
                case 3:
                    // 附件邮件
                    MimeMessage attach = sender.createMimeMessage();
                    MimeMessageHelper attachHelper = new MimeMessageHelper(attach, true);
                    attachHelper.setFrom(bean.getFrom());
                    attachHelper.setTo(bean.getTo());
                    attachHelper.setSubject(bean.getSubject());
                    attachHelper.setText(bean.getText());
                    // 附件核心代码
                    attachHelper.addAttachment(bean.getAttachmentFilename(), bean.getFile());

                    sender.send(attach);
                    break;
            }
        }catch (Exception e){
            logger.error(e.getMessage());
        }
    }
}

EmailController类

import com.example.demo.email.EmailBean;
import com.example.demo.email.EmailUtil;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
@RestController
@RequestMapping("/email")
@Api(tags="email 邮箱测试")
public class EmailController {
    // 引入日志
    private final static Logger logger = LoggerFactory.getLogger(EmailController.class);
    @Autowired
    private EmailUtil util;

    @RequestMapping(value = "/sendText", method = RequestMethod.GET)
    public void sendText() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        //mailMessage.s
        // 简单文本邮件发送
        EmailBean text = new EmailBean();
        text.setFrom("xxxx@163.com");
        text.setTo("xxxxx@163.com");
        text.setSubject("简单文本邮件发送");
        text.setText("简单文本邮件发送");
        text.setType(Integer.valueOf(1));
        util.send(text);
        logger.error("简单文本邮件发送成功");
    }

    @RequestMapping(value = "/sendHTML", method = RequestMethod.GET)
    public void sendHTML() {
        // 简单文本邮件发送
        EmailBean text = new EmailBean();
        text.setFrom("xxxx@163.com");
        text.setTo("xxxxx@163.com");
        text.setSubject("HTML邮件发送");
        StringBuffer sb = new StringBuffer();
        sb.append("<h1>HTML邮件发送</h1>")
                .append("<p style='color:#F00'>红色字</p>")
                .append("<p style='text-align:right'>右对齐</p>");

        text.setText(sb.toString());
        text.setType(Integer.valueOf(2));
        util.send(text);
        logger.error("HTML邮件发送成功");
    }

    @RequestMapping(value = "/sendAttach", method = RequestMethod.GET)
    public void sendAttach() {
        // 简单文本邮件发送
        EmailBean text = new EmailBean();
       text.setFrom("xxxx@163.com");
        text.setTo("xxxxx@163.com");
        text.setSubject("邮件附件发送");
        text.setText("邮件附件发送");
        FileSystemResource file = new FileSystemResource(new File("D:\\20180927180957106.png"));
        text.setFile(file);
        text.setAttachmentFilename("zheng");
        text.setType(Integer.valueOf(3));
        util.send(text);
        logger.error("HTML邮件发送成功");
    }
}

异步发送

启动类加入@EnableAsync注解开启异步:

@SpringBootApplication
@EnableAsync//开启异步
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

定义异步线程池:

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

在需要异步的方法上@Async 注解:
则在EmailUtil 类的 send 方法是加上 @Async(“taskExecutor”) 注解
方法在调用switch之前 加入

Thread.sleep(1000);//异步执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值