最详细的SpringBoot发送邮件教程

一、获取服务器授权码

简单来说,就是你需要使用什么邮箱来发送邮件,需要获取到这个发送邮箱的授权码才能有这个权限,这里使用 QQ 邮箱为例

最详细的SpringBoot发送邮件教程
最详细的SpringBoot发送邮件教程
最详细的SpringBoot发送邮件教程

这个就是 QQ 邮箱的授权码,请妥善保管

二、基本配置

1. 添加相关的 POM 文件

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

2. 配置 yml 文件

spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 发送者邮箱
    username: xxxx@qq.com
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    password: xxxxxx
    # 端口号465或587
    port: 587
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties: # 设置邮件超时时间防止服务器阻塞
      timeout: 5000
      connection-timeout: 5000
      write-timeout: 5000
      mail:
        smtp:
          socketFactoryClass: Javax.net.ssl.SSLSocketFactory
        #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        debug: true
  • 126邮箱 服务器地址:smtp.126.com,端口号:465 或者 994
  • 2163邮箱 服务器地址:smtp.163.com,端口号:465 或者 994
  • yeah邮箱 服务器地址:smtp.yeah.net,端口号:465 或者 994
  • qq邮箱 服务器地址:smtp.qq.com,端口号 465 或 587

三、邮件服务

1. 定义邮件接口

public interface IEmailService {


    /**
     * 普通邮件发送
     *
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     */

    void sendText(String form, String to, String subject, String content);

    /**
     * Html邮件发送
     *
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     */

    void sendHtml(String form, String to, String subject, String content);

    /**
     * 邮件发送
     *
     * @param name    发送人名称
     * @param form    发送人
     * @param to      发送对象
     * @param subject 主题
     * @param content 内容
     * @param isHtml  是否为html
     * @param cc      抄送,多人用逗号隔开
     * @param bcc     密送,多人用逗号隔开
     * @param files   文件
     */

    void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files);


}

这里我定义了三个邮件发送的接口,一个是普通文本,一个是 HTML 的,最后一个是综合类型的,可以根据参数自己配置内容(附件,抄送等配置)

2. 邮件实现类

@Slf4j
@Service
public class EmailServiceImpl implements IEmailService {

    @Autowired
    private JavaMailSender javaMailSender;//注入邮件工具类

    @Override
    public void send(String name, String form, String to, String subject, String content, Boolean isHtml, String cc, String bcc, List<File> files) {

        if (StringUtils.isAnyBlank(form, to, subject, content)) {
            throw new ServiceException("发送人,接收人,主题,内容均不可为空");
        }
        try {
            //true表示支持复杂类型
            MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
            //邮件发信人
            messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));
            //邮件收信人
            messageHelper.setTo(to.split(","));
            //邮件主题
            messageHelper.setSubject(subject);
            //邮件内容
            messageHelper.setText(content, isHtml);
            //抄送
            if (!StringUtils.isEmpty(cc)) {
                messageHelper.setCc(cc.split(","));
            }
            //密送
            if (!StringUtils.isEmpty(bcc)) {
                messageHelper.setCc(bcc.split(","));
            }
            //添加邮件附件
            if (CollectionUtil.isNotEmpty(files)) {
                for (File file : files) {
                    messageHelper.addAttachment(file.getName(), file);
                }
            }
            // 邮件发送时间
            messageHelper.setSentDate(new Date());
            //正式发送邮件
            javaMailSender.send(messageHelper.getMimeMessage());
        } catch (Exception e) {
            throw new ServiceException("邮件发送失败", e);
        }


    }


    @Override
    public void sendText(String form, String to, String subject, String content) {
        this.send("评论提醒", form, to, subject, content, falsenullnullnull);
    }

    @Override
    public void sendHtml(String form, String to, String subject, String content) {
        this.send("评论提醒", form, to, subject, content, truenullnullnull);
    }

}

测试发送

最详细的SpringBoot发送邮件教程

每一行代码的注释我也都注释了,不难解释,这里我提出一点的是

//邮件发信人
messageHelper.setFrom(new InternetAddress(name + "<" + form + ">"));

这里是为了发送邮件的时候的发送者名称可以自定义,而不是上述中的邮箱名称

最详细的SpringBoot发送邮件教程

这样是不是好看多了

3.HTML 邮件

有时候,我们需要展示好看的邮件格式用 HTML 编写,然后使用占位符填充 HTML 的内容,所以这里使用TemplateEngine来做

  1. 新增 POM
<!--thymeleaf-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 创建 HTML 模板 在 resoureces 文件夹下创建 template.html 文件
最详细的SpringBoot发送邮件教程

这里还是以博客回复发送的邮件为例

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>评论提醒</title>
    <style>
        .button {
            background-colorrgb(14 165 233);
            border-radius10px;
            border#181818;
            color: white;
            padding6px 10px;
        }

        .avatar {
            width60px;
            height60px;
            border-radius9px;
        }
    
</style>
</head>
<body>
<div>
    <div style="display: flex;align-items: center">
        <img class="avatar" src="https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100" alt="头像">
        <div style="display: block;margin-left: 10px">
            <p th:text="'您好,'+${oldNickname}"></p>
            <p>您在本站的留言收到了回复:</p>
        </div>
    </div>
    <p><strong>您的评论内容:</strong></p>
    <p th:text="${oldContent}"></p>
    <p><strong th:text="${nickname}+'回复内容:'"></strong></p>
    <p th:text="${newContent}"><strong></strong></p>
    <button class="button">
        <a th:href="${url}">查看详细内容</a>
    </button>
    <p>此邮件由系统自动发出,请勿直接回复</p>
</div>
</body>
</html>

这里的${}就是占位符,在发送的时候填充数据即可,具体的thymeleaf相关语法写法可以去百度找找

  1. 发送 HTML 邮件
@SpringBootTest
public class EmailTest implements Serializable {

    @Autowired
    private IEmailService emailService;

    @Autowired
    private TemplateEngine templateEngine;

    @Test
    public void test_email_text() {
        Context context = new Context();
        context.setVariable("avatar""https://q1.qlogo.cn/headimg_dl?dst_uin=1032065316&spec=100");
        context.setVariable("nickname""Mr.Sun");
        context.setVariable("newContent""测试新的评论");
        context.setVariable("oldContent""这是旧的评论");
        context.setVariable("oldNickname""腾讯视频");
        context.setVariable("url""https://www.xiaoquanya.com");
        String content = templateEngine.process("commentTemplate.html", context);
        emailService.sendHtml("xxxx@qq.com""xxxx@qq.com""您在 『 Mr.Sun的博客 』上的留言有新的回复", content);
    }

}

这里使用Context context = new Context();来填充刚刚的 html 中的数据,然后发送就可以了

原文始发于微信公众号(一零贰肆):最详细的SpringBoot发送邮件教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/250557.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!