java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot邮件推送

SpringBoot实现邮件推送的详细代码

作者:deer348

在项目中经常会遇到SpringBoot推送消息的业务,除了站内推送通知,邮件推送也是一种常见的方式,本文小编就带大家实现邮件推送,文中有详细代码讲解,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

SpringBoot实现邮件推送

在项目中经常会遇到SpringBoot推送消息的业务,除了站内推送通知,邮件推送也是一种常见的方式,本次小编就带大家实现邮件推送。

引入依赖

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

在项目中,使用第二个依赖再结合静态的html文件就可以实现,将邮件以预定义模板的形式发送出去。

在实际中只需要将对应的值以Map的方式填入到对应字段中即可,别急~接下来会带大家实现的。

配置

在项目配置中加入如下配置

yml格式如下:

spring:
  # 邮箱配置
  mail:
    host: smtp.qq.com
    # 用户名 替换成你实际的用户名
    username: test@foxmail.com
    # 授权码 可以去官方申请 不是个人邮箱密码
    password: xxxxxxxxxx

application.properties文件格式如下:

# 需要开启 smtp qq邮箱为例
spring.mail.host=smtp.qq.com
spring.mail.port=465
# 发件人的邮箱
spring.mail.username=xxxxx
# qq 邮箱的第三方授权码 并非个人密码
spring.mail.password=xxxx
#开启ssl 否则 503 错误 但是实际测试发现其实不加也不会报错 但是最好还是加上
spring.mail.properties.mail.smtp.ssl.enable=true

代码具体实现

创建邮件实体封装类

package com.ican.model.dto;
​
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
​
import java.util.Map;
​
/**
 * 邮箱DTO
 * @author xiayexiaolu
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "邮箱DTO")
public class MailDTO {
​
    /**
     * 接收者邮箱号
     */
    @ApiModelProperty(value = "接收者邮箱号")
    private String toEmail;
​
    /**
     * 主题
     */
    @ApiModelProperty(value = "主题")
    private String subject;
​
    /**
     * 内容
     */
    @ApiModelProperty(value = "内容")
    private String content;
​
    /**
     * 内容信息
     */
    @ApiModelProperty(value = "内容信息")
    private Map<String, Object> contentMap;
​
    /**
     * 邮件模板
     */
    @ApiModelProperty(value = "邮件模板")
    private String template;
}
​

创建邮件服务接口并实现

package com.ican.service;
​
import com.ican.model.dto.MailDTO;
​
/**
 * 邮件服务接口
 *
 * @author xiaoyexiaolu
 **/
public interface EmailService {
​
    /**
     * 发送简单邮件
     *
     * @param mailDTO 邮件信息
     */
    void sendSimpleMail(MailDTO mailDTO);
​
    /**
     * 发送HTML邮件
     *
     * @param mailDTO 邮件信息
     */
    void sendHtmlMail(MailDTO mailDTO);
}
​

对接口进行实现,下面为模板代码,可直接使用:

package com.ican.service.impl;
​
import com.ican.model.dto.MailDTO;
import com.ican.service.EmailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
​
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
​
/**
 * 邮件服务接口实现类
 *
 * @author xiayexiaolu
 **/
@Service
public class EmailServiceImpl implements EmailService {
​
    /**
     * 邮箱号
     */
    @Value("${spring.mail.username}")
    private String email;
​
    @Autowired
    private JavaMailSender javaMailSender;
​
    @Autowired
    private TemplateEngine templateEngine;
​
    @Override
    public void sendSimpleMail(MailDTO mailDTO) {
        SimpleMailMessage simpleMail = new SimpleMailMessage();
        simpleMail.setFrom(email);
        simpleMail.setTo(mailDTO.getToEmail());
        simpleMail.setSubject(mailDTO.getSubject());
        simpleMail.setText(mailDTO.getContent());
        javaMailSender.send(simpleMail);
    }
​
    @Override
    public void sendHtmlMail(MailDTO mailDTO) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
            Context context = new Context();
            context.setVariables(mailDTO.getContentMap());
            String process = templateEngine.process(mailDTO.getTemplate(), context);
            mimeMessageHelper.setFrom(email);
            mimeMessageHelper.setTo(mailDTO.getToEmail());
            mimeMessageHelper.setSubject(mailDTO.getSubject());
            mimeMessageHelper.setText(process, true);
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

其实到这里发送邮件就已经能用了,但是如果使用原生发送邮件的方式可能会有少许缺点。使用消息队列有以下好处

使用消息队列实现邮件发送

额外引入依赖

<!-- spring amqp -->
<dependency>
      <groupId>cn.dev33</groupId>
      <artifactId>sa-token-spring-boot-starter</artifactId>
      <version>${saToken.version}</version>
</dependency>

这个依赖会自动地添加所需的 RabbitMQ 客户端库,并配置好Spring Boot的AMQP支持。

在配置中配置连接

spring:
  # rabbitmq配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        retry:
          enabled: true
          # 重试间隔时间
          initial-interval: 3000
          # 最大重试次数
          max-attempts: 3

创建邮件消费者

package com.ican.consumer;

import com.ican.model.dto.MailDTO;
import com.ican.service.EmailService;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import static com.ican.constant.MqConstant.*;

/**
 * 邮件消费者
 * @author xiayexiaolu
 */
@Component
public class EmailConsumer {

    @Autowired
    private EmailService emailService;

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = EMAIL_SIMPLE_QUEUE, durable = "true", autoDelete = "false"),
                    exchange = @Exchange(value = EMAIL_EXCHANGE, type = ExchangeTypes.TOPIC),
                    key = EMAIL_SIMPLE_KEY
            )})
    public void listenSendSimpleEmail(@Payload MailDTO mail) {
        emailService.sendSimpleMail(mail);
    }

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = EMAIL_HTML_QUEUE, durable = "true", autoDelete = "false"),
                    exchange = @Exchange(value = EMAIL_EXCHANGE, type = ExchangeTypes.TOPIC),
                    key = EMAIL_HTML_KEY
            )})
    public void listenSendHtmlEmail(@Payload MailDTO mail) {
        emailService.sendHtmlMail(mail);
    }
}

具体使用

首先需要创建一个邮件对象

MailDTO mailDTO = new MailDTO();
mailDTO.setToEmail("目标邮箱");
mailDTO.setSubject("邮件主题");
mailDTO.setTemplate("邮件使用的模板");  //这里需要在之前加入了thymeleaf依赖支持
mailDTO.setContentMap(contentMap);

// 这里的contentMap是一个HashMap 也是最重要的参数,用于将值映射到模板中 具体示例如下图所示

然后直接使用代码:

// 发送HTML邮件
 rabbitTemplate.convertAndSend(EMAIL_EXCHANGE, EMAIL_HTML_KEY, mailDTO);

背后的原理

总的来说,执行 rabbitTemplate.convertAndSend(EMAIL_EXCHANGE, EMAIL_HTML_KEY, mailDTO); 之后,程序并不会自动调用消费者中的代码,而是将消息发送到 RabbitMQ 中,并触发消费者的监听。一旦有消息到达队列,消费者会立即执行对应的消费方法,完成邮件发送的过程。

小结

本文介绍了如何在Spring Boot项目中实现邮件推送功能。首先,通过引入相关依赖,包括spring-boot-starter-mailspring-boot-starter-thymeleaf,使得项目具备了发送邮件和使用Thymeleaf模板的能力。然后,配置了邮件服务的连接信息,包括邮箱的主机、端口、用户名和授权码等。接着,创建了邮件实体封装类MailDTO,定义了邮件的相关信息。通过邮件服务接口EmailService和其实现类EmailServiceImpl,实现了发送简单邮件和HTML邮件的功能。此外,还介绍了使用消息队列来异步处理邮件发送的好处,以及如何通过RabbitMQ实现邮件发送的异步处理。最后,通过具体的代码示例,展示了如何在项目中使用消息队列发送邮件,并给出了发送邮件的具体步骤。

以上就是SpringBoot实现邮件推送的详细代码的详细内容,更多关于SpringBoot邮件推送的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文