Spring Email使用
Spring Email使用

Spring Email使用

邮箱设置

需要去邮箱对应的官方客户端软件或网站开启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一下项目就可以运行了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

index