SpringBoot 实现邮件发送

本内容根据松哥的 SpringBoot 付费视频所做的学习笔记,想具体详细了解内容的,请关注微信公众号:江南一点雨

使用 Java Mail 发送QQ邮件

1. 准备工作:打开QQ邮箱的账号设置,开启服务。

image-20210730145145222

在账号设置中,找到以下选项。其中 POP3 和 IMAP 两个都行,选择其中一个开启,这里选择第一个。
image-20210730145244052
我们通过打开如何使用 Foxmail 等软件收发邮件,在里面可以找到服务器端口号。
image-20210730150427434

在设置开启服务,客户端需要你进行短信验证,验证成功后将会返回以下授权码。授权码将会代替邮箱密码进行发送邮件。

image-20210730145945017

准备工作完成后,就可以开始创建工程了。先来一个简单的发送邮件。

创建 SpringBoot 项目,添加以下这两个依赖。
image-20210730150729301
创建完成项目后,我们首先需要对邮箱进行基本配置。配置信息如下:

# 腾讯的邮件服务器
spring.mail.host=smtp.qq.com
# 我们在准备工作中找到的服务器端口号
spring.mail.port=465
# 邮箱的账号
spring.mail.username=111@qq.com
# 开启服务时,服务器返回给我们的授权码
spring.mail.password=xfpmlqmyxhpudecf
# 编码
spring.mail.default-encoding=utf-8
# 加密连接的工具类
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
# 开启debug
spring.mail.properties.mail.debug=true;

配置完以上信息,我们就可以在进行邮件发送了。

2. 简单的邮件发送

@Autowired
JavaMailSender javaMailSender;

@Test
void contextLoads() {
    SimpleMailMessage simpMsg = new SimpleMailMessage();
    // 发送人的邮箱
    simpMsg.setFrom("111@qq.com");
    // 接收人的邮箱
    simpMsg.setTo("222@qq.com");
    // 发送的时间
    simpMsg.setSentDate(new Date());
    // 发送邮件的主题
    simpMsg.setSubject("邮件主题-测试邮件");
    // 发送邮件的内容
    simpMsg.setText("邮件内容-测试邮件");
    javaMailSender.send(simpMsg);
}

3. 带附件的邮件发送

@Test
void test1() throws MessagingException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    // 发送人的邮箱
    helper.setFrom("1963385876@qq.com");
    // 接收人的邮箱
    helper.setTo("2516313840@qq.com");
    // 发送的时间
    helper.setSentDate(new Date());
    // 发送邮件的主题
    helper.setSubject("邮件主题-测试邮件");
    // 发送邮件的内容
    helper.setText("邮件内容-测试邮件");
    // 要发送的附件
    File file = new File("C:/Users/19633/Desktop/123.png");
    helper.addAttachment(file.getName(),file);
    javaMailSender.send(mimeMessage);
}

4. 邮件内容中带有图片的邮件发送

不推荐,原因是如果发送的图片太大太多会导致邮件发送失败。并且有时候,成功发送带有图片的邮件,但是有时候在邮箱中查看并不显示图片,这并不是图片没有发送的原因。

@Test
void test2() throws MessagingException {
    // 要发送的附件
    File file = new File("C:/Users/19633/Desktop/123.png");
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    // 发送人的邮箱
    helper.setFrom("1963385876@qq.com");
    // 接收人的邮箱
    helper.setTo("2516313840@qq.com");
    // 发送的时间
    helper.setSentDate(new Date());
    // 发送邮件的主题
    helper.setSubject("邮件主题-测试邮件");
    // 发送邮件的内容, 第一个参数表示发送的 HTML 文件内容,第二个参数表示支持 HTML 。
    // 其中,img 标签中的 'cid:p01' 表示占位符
    helper.setText("<div>带有图片的邮件内容:</div><div><img src='cid:p01'/></div>",true);
    helper.addAttachment("p01",file);
    javaMailSender.send(mimeMessage); 
}

5. 使用 freemarker 模板实现邮件发送

使用 freemarker 模板进行邮件发送,也就只是将定义好的模板转换成字符的形式发送到邮箱中。

  1. 添加 freemarker 依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  1. 在 resources 下创建 freemarker 邮件模板,这里在 mail 目录下创建。

image-20210730162808201

mail.ftl 邮件模板:

<div>欢迎 ${username} 加入 ${company} 大家庭,您的入职信息如下:</div>
<table border="1">
    <tr>
        <td>姓名</td>
        <td>${username}</td>
    </tr>
    <tr>
        <td>职位</td>
        <td>${position}</td>
    </tr>
    <tr>
        <td>薪水</td>
        <td>${salary}</td>
    </tr>
</table>
<div style="color: #ff0016;font-size: large">希望在未来的日子里携手奋进!</div>
  1. 为邮件模板创建一个 model 实体类,用于邮件模板的属性设置。
public class User {
    private String username;
    private double salary;
    private String position;
    private String company;
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }
}
  1. 发送邮件。
@Test
void test3() throws MessagingException, IOException, TemplateException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    // 发送人的邮箱
    helper.setFrom("1963385876@qq.com");
    // 接收人的邮箱
    helper.setTo("2516313840@qq.com");
    // 发送的时间
    helper.setSentDate(new Date());
    // 发送邮件的主题
    helper.setSubject("邮件主题-测试邮件");
    // 注意:Configuration 为 freemarker.template.Configuration
    Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
    // 参数1表示类加载器,参数2表示 freemarker 模板加载的目录
    cfg.setClassLoaderForTemplateLoading(MailApplicationTests.class.getClassLoader(),"mail");
    // 获取 freemarker 模板
    Template template = cfg.getTemplate("mail.ftl");
    // model 实例
    User user = new User();
    user.setUsername("crc");
    user.setCompany("xxx公司");
    user.setPosition("Java架构师");
    user.setSalary(999999999.0);
    // 设置 freemarker 模板属性
    StringWriter out = new StringWriter();
    template.process(user,out);
    // 将 freemarker 模板转换成字符串
    String text = out.toString();
    // 可以在控制台查看生成的 HTML 文件内容
    System.out.println(text);
    // 设置邮件内容
    helper.setText(text, true);
    javaMailSender.send(mimeMessage);
}

6. 使用 Thymeleaf 模板实现邮件发送(推荐)

Thymeleaf 与 freemarker 的区别:

  • Thymeleaf 实现邮件发送比 freemarker 更加简洁。
  • Thymeleaf 实现邮件发送不需要指定 Thymeleaf 模板位置
  1. 导入 Thymeleaf 依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 在 resources/templates 目录下创建 Thymeleaf 模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div>欢迎 <span th:text="${username}"></span> 加入 <span th:text="${company}"></span> 大家庭,您的入职信息如下:</div>
<table border="1">
  <tr>
    <td>姓名</td>
    <td th:text="${username}"></td>
  </tr>
  <tr>
    <td>职位</td>
    <td th:text="${position}"></td>
  </tr>
  <tr>
    <td>薪水</td>
    <td th:text="${salary}"></td>
  </tr>
</table>
<div style="color: #ff0016;font-size: large">希望在未来的日子里携手奋进!</div>
</body>
</html>
  1. 发送邮件
@Autowired
TemplateEngine templateEngine;

@Test
void test4() throws MessagingException, IOException, TemplateException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    // 发送人的邮箱
    helper.setFrom("1963385876@qq.com");
    // 接收人的邮箱
    helper.setTo("2516313840@qq.com");
    // 发送的时间
    helper.setSentDate(new Date());
    // 发送邮件的主题
    helper.setSubject("邮件主题-测试邮件");
    // 设置上下文
    Context ctx = new Context();
    ctx.setVariable("username","crc");
    ctx.setVariable("position","Java工程师");
    ctx.setVariable("company","xxx集团");
    ctx.setVariable("salary","99999");
    // 参数1 表示模板的位置(默认在template目录下查找),参数2 表示模板的上下文,不能使用对象
    String text = templateEngine.process("mail.html", ctx);
    // 设置邮件内容
    helper.setText(text, true);
    javaMailSender.send(mimeMessage);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值