SpringBoot集成各类邮箱进行邮件发送

主要内容

利用SpringBoot集成各类邮箱发送邮件,是一个比较简单的内容,主要有三步:

  • 添加邮件相关Starter模块依赖
  • 添加Spring Boot配置(QQ/网易系/Gmail)
  • 调用JavaMailSender接口发送邮件

必备知识点

在第三步中,发送邮件,为了格式好看,是否有附件,像真正的邮件客户端看到的邮件一样格式清晰等,可能需要自己改一改发送内容的格式,比如html格式等。

  • 难点在第二步中需要配置使用的邮箱配置,而对于各个邮箱的配置又需要搞清楚各个协议及部分名词的解释和使用【POP3、SMTP和IMAP、授权码、免费邮箱功能、开通协议方式】

添加Starter模块依赖

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

添加Spring Boot配置

在application.yml中添加邮件相关的配置,这里分别罗列几个常用邮件的配置比如QQ邮箱、网易系邮箱、Gmail邮箱。

根据使用不同的邮箱,分别配置到application.yml配置文件中即可,其中application-126.yml、application-163.yml、application-gmail.yml、application-yeah.yml 已经提供了配置样例。

常用几种邮件形式接口的封装

import javax.mail.MessagingException;
public interface IMailService {

    /**
     * 发送文本邮件
     * @param to
     * @param subject
     * @param content
     */
    public void sendSimpleMail(String to, String subject, String content);

    public void sendSimpleMail(String to, String subject, String content, String... cc);

    /**
     * 发送HTML邮件
     * @param to
     * @param subject
     * @param content
     * @throws MessagingException
     */
    public void sendHtmlMail(String to, String subject, String content) throws MessagingException;

    public void sendHtmlMail(String to, String subject, String content, String... cc);

    /**
     * 发送带附件的邮件
     * @param to
     * @param subject
     * @param content
     * @param filePath
     * @throws MessagingException
     */
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) throws MessagingException;

    public void sendAttachmentsMail(String to, String subject, String content, String filePath, String... cc);

    /**
     * 发送正文中有静态资源的邮件
     * @param to
     * @param subject
     * @param content
     * @param rscPath
     * @param rscId
     * @throws MessagingException
     */
    public void sendResourceMail(String to, String subject, String content, String rscPath, String rscId) throws MessagingException;

    public void sendResourceMail(String to, String subject, String content, String rscPath, String rscId, String... cc);
}

然后在实现类中,对于每种方法实现其发送方法,写具体业务逻辑封装。

特别说明:
还可以集成邮件模板,邮件也有一个邮件模板的,只需要依赖对应库文件,然后使用对应api可以简单使用,复杂使用也是需要自己定义格式的。

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

可能遇到的问题

JavaMailSender mailSender;无法注入问题,这个问题太常见了,错误如下:

No qualifying bean of type ‘org.springframework.mail.javamail.JavaMailSender’ available: expected at least 1 bean which qualifies as autowire candidate

当然这个错误问题肯定有很多原因的,比如扫描不到这个类、配置不对等其它各种原因。
怎么解决?必须先搞清楚原因
打开springboot调试模式观察debug输出,查看JavaMailSender这个类的注入日志,就是吧debug模式打开,看看啥问题。

public static void main(String[] args) {
    SpringApplication.run(Application.class, "--debug");
}

正常情况下如上,在启动类中把debug模式打开就可以了,先确定问题。
我遇到的问题是扫描到了就是无法注入的情况。各种百度无果,谷歌找了好久终于知道
SpringBoot集成各类邮箱进行邮件发送_第1张图片
出错原因:
  加载 JavaMailSender 对象到容器,需要根据配置文件中的配置作为参数初始化,也就是说在application.yml文件中有没有配置发送的邮箱,且有没有配置正确。
  但是在错误日志里面我们确实看不出来错误原因的。
部分错误日志如下:
SpringBoot集成各类邮箱进行邮件发送_第2张图片

参考其它博客:

  • SpringBoot 2.x
    集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件
    JavaMailSender注入失败的解决方法

当前项目源代码下载
SpringBoot集成各类邮箱进行邮件发送Demo

你可能感兴趣的:(SpringBoot)