当前位置:   article > 正文

SpringBoot邮件发送_springboot发送邮件

springboot发送邮件

SpringBoot邮件发送

邮件发送是一个非常常见的功能,注册时的身份认证、重要通知发送等都会用到邮件发送。Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring 中提供了JavaMailSender 用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。

1. 发送前的准备

本节以QQ邮箱为例向读者介绍邮件的发送过程。使用QQ邮箱发送邮件,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。SMTP全称为Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。也就是说,aaa@qq.com 用户先将邮件投递到腾讯的SMTP服务器,这个过程就使用了SMTP协议,然后腾讯的SMTP服务器将邮件投递到网易的SMTP服务器,这个过程依然使用了SMTP协议,SMTP服务器就是用来接收邮件的。而POP3全称为Post Office Protocol3,译作邮局协议,它定义了邮件客户端与POP3服务器之间的通信规则。该协议在什么场景下会用到呢?当邮件到达网易的SMTP服务器之后,111@163.com 用户需要登录服务器查看邮件,这个时候就用上该协议了:邮件服务商会为每一个用户提供专门的邮件存储空间,SMTP服务器收到邮件之后,将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的POP3邮件服务器来完成。至于IMAP协议,则是对POP3协议的扩展,功能更强,作用类似。下面介绍QQ邮箱开通POP3/SMTP服务或者IMAP/SMTP服务的步骤。

步骤01 登录QQ邮箱,依次单击顶部的设置按钮和账户按钮如图所示。
在这里插入图片描述

在这里插入图片描述

步骤02 在账户选项卡 下方找到POP3/SMTP服务,单击后方的“开启”按钮,如图所示。

在这里插入图片描述

单击“开启”按钮后,按照引导步骤发送短信,操作成功后,会获取一个授权码,将授权码保存下来过后使用。

在这里插入图片描述

拿到授权码后,准备工作就完成了。

2. 发送

2.1 环境搭建

使用Spring Boot发送邮件,环境搭建非常容易,首先在创建项目时添加邮件依赖,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4

项目创建成功后,在application.properties中完成邮件基本信息配置,代码如下:

# 配置邮件服务器的地址
spring.mail.host=smtp.qq.com
# 配置邮件服务器的端口(465或587)
spring.mail.port=465
# 配置用户的账号
spring.mail.username=123@qq.com
# 配置用户的密码(即上面我们申请到的授权码)
spring.mail.password=qgczjydhuqytabcd
# 配置默认编码
spring.mail.default-encoding=UTF-8
# SSL 连接配置
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
# 开启 debug,这样方便开发者查看邮件发送日志
spring.mail.properties.mail.debug=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里配置了邮件服务器的地址、端口(可以是465或者587)、用户的账号和密码以及默认编码、SSL连接配置等,最后开启debug,这样方便开发者查看邮件发送日志。注意,SSL的配置可以在QQ邮箱帮助中心看到相关文档,如图所示。

在这里插入图片描述

完成这些配置之后,基本的邮件发送环境就搭建成功了,接下来就可以发送邮件了。邮件从简单到复杂有多种类型,下面分别予以介绍。

2.2 发送简单邮件

创建一个MailService用来封装邮件的发送,代码如下:

@Component
public class MailService {
 
    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;
 
    //方法5个参数分别表示:邮件发送者、收件人、抄送人、邮件主题以及邮件内容
    public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
        // 简单邮件直接构建一个 SimpleMailMessage 对象进行配置并发送即可
        SimpleMailMessage simpMsg = new SimpleMailMessage();
        simpMsg.setFrom(from);
        simpMsg.setTo(to);
        simpMsg.setCc(cc);
        simpMsg.setSubject(subject);
        simpMsg.setText(content);
        javaMailSender.send(simpMsg);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

代码解释:

  • JavaMailSender 是Spring Boot在MailSenderPropertiesConfiguration 类中配置好的,该类在Mail自动配置类MailSenderAutoConfiguration中导入,因此这里注入JavaMailSender就可以使用了。
  • sendSimpleMail方法的5个参数分别表示邮件发送者、收件人、抄送人、邮件主题以及邮件内容。
  • 简单邮件可以直接构建一个SimpleMailMessage 对象进行配置,配置完成后,通过JavaMailSender将邮件发送出去。

接着我们创建一个 Controller 调用这个 Service 方法进行测试:

@RestController
public class HelloController {
 
    @Autowired
    MailService mailService;
 
    @GetMapping("/hello")
    public void hello() {
        mailService.sendSimpleMail("123@QQ.com",
                "1421548723@qq.com",
                "123456@qq.com",
                "我是邮件的标题",
                "我是邮件的内容");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这里使用MimeMessageHelper简化了邮件配置,它的构造方法的第二个参数true表示构造个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。最后通过addAttachment方法添加附件。

执行该方法,即可看到邮件发送成功,如图所示。

在这里插入图片描述

2.3 发送带附件的邮件

要发送一个带附件的邮件也非常容易,通过调用Attachment 方法即可添加附件,该方法调用多次即可添加多个附件。在MailService中添加如下方法:

这里使用 MimeMessageHelper 简化邮件配置,通过 MimeMessageHelper 构造一个 multipart message 类型邮件来发送,multipart message 类型邮件可以包含多个正文、附件以及内嵌资源。

@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带附件的邮件
    // 方法5个参数分别表示:邮件发送者、收件人、邮件主题、邮件内容、以及附件
    public void sendAttachFileMail(String from, String to,
                                   String subject, String content, File file) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            // 这里使用 MimeMessageHelper 简化了邮件配置
            // 第二个参数true表示构造一个 multipart message 类型邮件
            // multipart message类型邮件包含多个正文、附件以及内嵌资源,邮件表现形式更加丰富
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content);
            // 最后通过 addAttachment 方法添加附件
            helper.addAttachment(file.getName(), file);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

接着我们创建一个 Controller 调用这个 Service 方法进行测试:

@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @GetMapping("/hello")
    public void hello() {
        mailService.sendAttachFileMail("123@QQ.com",
                "1421548723@qq.com",
                "我是邮件的标题",
                "我是邮件的内容",
                new File("C:/Users/Administrator/Pictures/Saved Pictures/fthsrethstrywegwerrg5.jpg"));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

执行该方法,即可看到邮件发送成功,如图所示。

在这里插入图片描述

2.4 发送带图片资源的邮件

有的邮件正文中可能要插入图片,使用FileSystemResource可以实现这一功能,代码如下:

@Component
public class MailService {
    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带附件的邮件
    // 方法5个参数分别表示:邮件发送者、收件人、邮件主题、邮件内容、图片资源路径、以及资源id
    public void sendMailWithImg(String from, String to,
                                String subject, String content,
                                String[] srcPath, String[] resIds) {
        if (srcPath.length != resIds.length) {
            System.out.println("发送失败");
            return;
        }
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper =
                    new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            // 第二个参数true表示邮件正文是HTML格式(默认为false)
            helper.setText(content, true);
            for (int i = 0; i < srcPath.length; i++) {
                // 通过FileSystemResource构造静态资源,让后调用addInline方法将资源加入到邮件对象中
                FileSystemResource res =
                        new FileSystemResource(new File(srcPath[i]));
                helper.addInline(resIds[i], res);
            }
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

首先我们创建一个Controller调用这个Service方法进行测试:

@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @GetMapping("/hello")
    public void hello() {
        mailService.sendMailWithImg("1036516218@QQ.com",
                "1421548723@qq.com",
                "这个是邮件的标题",
                "<div>hello,这是一封带图片资源的邮件:<br>" +
                        "这是图片1:<div><img src='cid:p01'/></div>" +
                        "这是图片2:<div><img src='cid:p02'/></div>" +
                        "</div>",
                new String[]{"C:/Users/Administrator/Pictures/Saved Pictures/fthsrethstrywegwerrg5.jpg",
                        "C:/Users/Administrator/Pictures/Saved Pictures/th.jfif"},
                new String[]{"p01", "p02"});
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

邮件的正文是一段HTML文本,用cid标注出两个静态资源,分别为p01和p02。执行该方法,邮件发送结果如图所示。

在这里插入图片描述

2.5 使用FreeMarker构建邮件模板

对于格式复杂的邮件,如果采用字符串进行HTML拼接,不但容易出错,而且不易于维护,使用HTML模板可以很好地解决这一问题。使用FreeMarker构建邮件模板,首先加入FreeMarker依赖,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

创建一个MailService用来封装邮件的发送,代码如下:

@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带HTML内容的邮件
    // 方法4个参数分别表示:邮件发送者、收件人、邮件主题、html格式的邮件内容
    public void sendHtmlMail(String from, String to, String subject, String content){
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在项目resources目录下创建ftl目录作为模版存放位置,在该目录下创建mailtemplate.ftl作为邮件模版,内容如下:

<div>邮箱激活</div>
<div>您的注册信息是:
    <table border="1">
        <tr>
            <td>用户名</td>
            <td>${username}</td>
        </tr>
        <tr>
            <td>用户性别</td>
            <td>${sex}</td>
        </tr>
    </table>
</div>
<div>
    <a href="#">核对无误请点击本链接激活邮箱</a>
</div>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

当然,再创建一个简单的User实体类,代码如下:

@Data
@NoArgsConstructor
public class User  {
    private String username;
    private String sex;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

首先我们创建一个Controller来发送邮件,这次我们通过FreeMarker模版渲染出邮件正文内容:

@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    //
    @GetMapping("/hello")
    public void hello() {
        try {
            // 首先配置 FreeMarker 模版位置
            Configuration configuration =
                    new Configuration(Configuration.VERSION_2_3_0);
            ClassLoader loader = TestforeverApplication.class.getClassLoader();
            configuration
                    .setClassLoaderForTemplateLoading(loader,"ftl");

            // 配置模版文件
            Template template = configuration.getTemplate("mailtemplate.ftl");

            // 结合 User 对象渲染模版
            StringWriter mail = new StringWriter();
            User user = new User();
            user.setUsername("suohe");
            user.setSex("男");
            template.process(user, mail);

            // 将渲染结果发送出去
            mailService.sendHtmlMail("123@qq.com",
                    "1421548723@qq.com",
                    "这个是邮件的标题",
                    mail.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

执行该方法,即可看到邮件发送成功,如图所示。

在这里插入图片描述

2.6 使用Thymeleaf构建邮件模板

既然可以使用FreeMarker 构建邮件模板,当然也可以使用Thymeleaf 构建邮件模板,使用Thymeleaf构建邮件模板相对来说更加方便。使用Thymeleaf构建邮件模板,首先添加Thymeleaf依赖,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

创建一个MailService用来封装邮件的发送,代码如下:

@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带HTML内容的邮件
    // 方法4个参数分别表示:邮件发送者、收件人、邮件主题、html格式的邮件内容
    public void sendHtmlMail(String from, String to, String subject, String content){
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

首先我们创建一个 Controller来发送邮件,这次我们通过Thymeleaf模版渲染出邮件正文内容:

注意:不同于 FreeMarker**,**Thymeleaf提供了TemplateEngine来对模版进行渲染,通过Context构造模版中变量需要的值,这种方式比 FreeMarker构建邮件模版更加方便。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件</title>
</head>
<body>
<div>邮箱激活</div>
<div>您的注册信息是:
    <table border="1">
        <tr>
            <td>用户名</td>
            <td th:text="${username}"></td>
        </tr>
        <tr>
            <td>用户性别</td>
            <td th:text="${sex}"></td>
        </tr>
    </table>
</div>
<div>
    <a href="#">核对无误请点击本链接激活邮箱</a>
</div>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @Autowired
    TemplateEngine templateEngine;

    @GetMapping("/hello")
    public void hello() {
        // 通过 Context 构造模版中变量需要的值
        Context ctx = new Context();
        ctx.setVariable("username", "suohe");
        ctx.setVariable("sex", "男");

        // 使用TemplateEngine 对模版进行渲染
        String mail = templateEngine.process("mailtemplate.html", ctx);

        // 将渲染结果通过邮件发出
        mailService.sendHtmlMail("123@qq.com",
                "1421548723@qq.com",
                "这个是邮件的标题",
                mail);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/532045
推荐阅读
相关标签
  

闽ICP备14008679号