邮箱设置
需要去邮箱对应的官方客户端软件或网站开启IMAP/SMTP服务或POP3/SMTP服务器,我这里使用QQ邮箱
如果不开启,就无法使用第三方用户代理,只能走官方的电子邮件客户端软件或网站,用户代理就是电子邮件客户端软件。
开启之后,我们就可以用Spring Email技术将整合的JavaMailSender作为发送邮件的用户代理。
配置文件
首先在pom.xml引入Spring Email依赖,这里可以不指定版本,因为SpringBoot父工程已经指定好了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
然后在SpringBoot配置文件中添加(这里以application.properties为例):
# mail
spring.mail.host=smtp.qq.com # 电子邮件服务器域名,Spring Email用户代理需要向那个服务器发送邮件
spring.mail.port=465 # 端口,一般是465,根据自己使用的邮箱修改
spring.mail.username=发送者邮箱(这里改成自己邮箱的地址即可)
spring.mail.password=邮箱密码(QQ邮箱是授权码,其余邮箱按照各自配置)
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.ssl.enable=true # 是否启用安全连接
使用JavaMailSender发送邮件
新建util包并新建MailClient类,邮箱客户端,因为JavaMailSender在发送邮件的过程中,扮演的角色是用户代理(电子邮件客户端软件)
首先来看一下JavaMailSender接口源码:
可以看到JavaMailSender接口只有两类方法:
send方法从字面既可以理解,这是用于发邮件的。
createMimeMessage 方法是干什么的呢?
要想理解这个方法,主要是要理解中间Mime的含义,Mime全称是Multipurpose Internet Mail Extension,多用途因特网邮件拓展。
那这个MIME有什么用呢?前面我们在配置时,使用的邮件传输协议时smtps,该协议与smtp一样,都支持传输ASCCII码文本数据,不可以传输其他可执行文件或者二进制对象,甚至连中文文字都传输不了。
SMTP无法满足传送多媒体邮件(带有图片、音频或视频数据)的需要,并且许多非英语国家的文字也无法使用通过SMTP传输。所以,为了解决SMTP无法传输非ASCII码文本的问题,MIME(Multipurpose Internet Mail Extension,多用途因特网邮件拓展)应运而生了。MIME最主要的作用就是定义了传送编码,可对任意内容格式进行转换,而不会被邮件系统所改变。
再来看编写好的MailClient类的源码:
package com.nowcoder.community.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* @author Fang Kun
* @description 邮件
* @date 2024/11/7 17:41
*/
@Component // 将这个bean交给Spring容器管理
public class MailClient {
private static final Logger LOGGER = LoggerFactory.getLogger(MailClient.class);
/*
* 要使用的核心组件是JavaMailSender,这个注解已经由spring来管理了
* 我们直接注入即可获取JavaMailSenderImpl实现类对象
* */
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from; //发件人
/**
* @description TODO
* @param to 发送目标
* @param subject 标题
* @param content 内容
* @return void
* @author fangkun
* @date 2024/11/11 16:48
*/
public void sendMail(String to, String subject, String content) {
try {
MimeMessage message = mailSender.createMimeMessage();
/*
* 这里通过message也可以实现setFrom,setTo等。
* 但是MimeMessageHelper帮助我们进行一些基础功能的实现比如:
* 邮箱地址检查是否满足格式、字符串是不是为空等等
* */
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true); // true代表支持HTML文本
mailSender.send(helper.getMimeMessage());
} catch (MessagingException e) {
LOGGER.error("发送邮件失败:" + e.getMessage());
}
}
}
这里还使用了前端Thymeleaf模板引擎,不作过多深入,直接展示编写测试类MailTests:
@SpringBootTest
public class MailTests {
@Autowired
private MailClient mailClient;
@Autowired
private TemplateEngine templateEngine;
@Test
public void testTextMail() {
mailClient.sendMail("这里修改成配置类的邮箱", "TEST", "Hello");
}
@Test
public void testHTMLMail() {
Context context = new Context();
context.setVariable("username", "sunday");
String content = templateEngine.process("/mail/demo", context); // 这里是因为demo.html在Templates目录下的这个路径
mailClient.sendMail("这里修改成配置类的邮箱", "HTML", content);
}
}
经过测试,均发送成功:
如果出现未找到/mail/demo报错,rebuild一下项目就可以运行了