SpringBoot发送邮件


SpringBoot发送邮件
邮件发送是一个很常见的功能,注册身份认证,找回密码等场景都会用到邮件发送。Spring Boot提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。

SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
也就是说 abc@qq.com 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。

而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后,abc@163.com 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。


申请开通POP3/SMTP服务

文章以qq邮箱的方式(其他邮箱步骤相同)
进入邮箱——>打开设置——>账户
在这里插入图片描述

  1. 找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
  2. 打开POP3/SMTP服务,开启服务后保存好授权码
    在这里插入图片描述
    授权码可以配置多个,如果忘记授权码可以重新申请。

环境搭建

1.引入依赖

<!-- Spring Mail依赖(发送邮件) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2.配置邮箱信息

server:
  port: 8080
spring:
  mail:
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 发送者邮箱,已开通POP3/SMTP服务的邮箱,也就是你自己的
    username: xxxxx@qq.com
    # 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
    password: 123456
    # 发送人昵称
    nickname: ufo_21
    # 端口号465或587(QQ邮箱发送邮件仅支持587端口协议)
    port: 587
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
        debug: true
邮箱类型SMTP服务器地址端口号
QQ邮箱smtp.qq.com465或587
sina邮箱smtp.sina.cn465或587
126邮箱smtp.126.com465或994
aliyun邮箱smtp.aliyun.com465或994
163邮箱smtp.163.com465或994
yeah邮箱smtp.yeah.net465或994

普通邮件发送

package com.ufo.maildemo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;

import java.util.Date;

@SpringBootTest
class MailDemoApplicationTests {
    
    @Autowired
    private JavaMailSender javaMailSender;

    // 获取yml配置的发送者邮箱
    @Value("${spring.mail.username}")
    private String mainUserName;

    //发送人昵称
    @Value("${spring.mail.nickname}")
    private String nickname;

    /**
     * 普通邮件发送
     */
    @Test
    public void sendSimpleMail() {
        // 构建一个邮件对象
        SimpleMailMessage message = new SimpleMailMessage();
        // 设置邮件主题
        message.setSubject("测试邮件");
        // 设置邮件发送者,昵称+<邮箱地址>
        message.setFrom(nickname+'<'+mainUserName+'>');
        // 设置邮件接收者,可以有多个接收者,多个接受者参数需要数组形式
        message.setTo("y****@163.com");
        // 设置邮件抄送人,可以有多个抄送人
        message.setCc("12****32*qq.com");
        // 设置隐秘抄送人,可以有多个
        message.setBcc("7******9@qq.com");
        // 设置邮件发送日期
        message.setSentDate(new Date());
        // 设置邮件的正文
        message.setText("hello,do you one more");
        // 发送邮件
        javaMailSender.send(message);
    }
}

发送效果如下:
在这里插入图片描述

FreeMarker模板发送邮件

对于格式比较复杂的邮件,推荐使用HTML模板

  1. 引入FreeMarker依赖
<!-- FreeMarker模板 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  1. 定义模板文件

在resources目录创建templates文件,把模板保存在templates下

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta charset="utf-8">
    <title>${title}</title>
    <style>
        .hello {
            display: flex !important;
            justify-content: center !important;
        }

        .areaBox {
            width: 500px;
            box-sizing: border-box;
        }

        .areaBox > .title {
            font-size: 2em;
        }


        .text {
            margin-bottom: 20px;
            color: #536AD8;
        }

    </style>
</head>
<body>
<div class="hello">
    <div class="areaBox">
        <p class="title">${title}</p>
        <p class="text">这是个模板</p>
    </div>
</div>
</body>
</html>

  1. 使用FreeMarker模版渲染出邮件内容(代码)
    /**
     * FreeMarker模板发送邮件
     */
    @Test
    public void sendFreeMarkerMail() throws IOException, MessagingException, TemplateException {
        // 首先配置 FreeMarker 模版位置
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
        // MailDemoApplication是启动类类名
        ClassLoader loader = MailDemoApplication.class.getClassLoader();
        configuration.setClassLoaderForTemplateLoading(loader, "templates");
        // 配置模版文件
        Template template = configuration.getTemplate("mail.ftl");
        // 渲染模版
        StringWriter mail = new StringWriter();
        HashMap<String, Object> map = new HashMap<>();
        map.put("title", "FreeMarker标题");
        template.process(map, mail);

        // 构建一个邮件对象
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        // 设置邮件发送者
        message.setFrom(nickname+'<'+mainUserName+'>');
        // 设置邮件接收者
        helper.setTo("y******9@163.com");
        // 设置邮件的主题
        message.setSubject("FreeMarker模板发送邮件");
        // 设置邮件的正文
        helper.setText(mail.toString(), true);
        // 发送邮件
        javaMailSender.send(message);
    }

发送效果如下:
在这里插入图片描述

如果想使用Thymeleaf模板发送邮件也是可以的,照葫芦画瓢。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot发送邮件需要使用JavaMailSender接口来实现。以下是一个简单的示例代码: 首先,确保在你的项目中添加了相关依赖。在pom.xml文件中添加以下代码: ```xml <dependencies> <!-- Spring Boot Starter Mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> </dependencies> ``` 然后,在你的应用程序中创建一个类来发送邮件。例如,你可以创建一个名为EmailSender的类: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Component; @Component public class EmailSender { @Autowired private JavaMailSender javaMailSender; public void sendEmail(String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(text); javaMailSender.send(message); } } ``` 在上述示例中,我们使用了@Autowired注解来自动注入JavaMailSender对象,该对象是由Spring Boot自动配置提供的。 现在,你可以在你的应用程序的任何地方使用EmailSender类来发送邮件。例如,你可以在控制器中使用它: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class EmailController { @Autowired private EmailSender emailSender; @PostMapping("/sendEmail") public String sendEmail(@RequestBody EmailRequest emailRequest) { emailSender.sendEmail(emailRequest.getTo(), emailRequest.getSubject(), emailRequest.getText()); return "Email sent successfully!"; } } ``` 上述示例中,我们创建了一个名为EmailController的REST控制器,它接收一个包含收件人、主题和内容的EmailRequest对象,并使用EmailSender发送邮件。 请注意,你需要适当配置你的邮件服务器信息。在Spring Boot的application.properties(或application.yml)文件中添加以下配置: ```yaml spring.mail.host=your-mail-server spring.mail.port=your-mail-server-port spring.mail.username=your-username spring.mail.password=your-password spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true ``` 以上是一个简单的示例,你可以根据你的实际需求进行修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值