SpringBoot发送邮件
本文最后更新于 543 天前,其中的信息可能已经有所发展或是发生改变。

这段时间的项目中突然需要用到发送邮件的功能,之前一直都觉得这个功能会很复杂,但是具体了解之后发现其实很简单,也就是调个接口的事情。

配置

首先导入包;在pom.xml中添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

然后在application.yml中配置smtp信息(把下面的信息换成自己服务商的配置)

spring:
  mail:
    host: smtp.ym.163.com # smtp地址
    username: mail@xxx.com # 用户名
    password: xxx # 密码
    default-encoding: utf-8
#   port: 994
    properties:
      mail.smtp.auth: true
      mail.smtp.timeout: 10000
      mail.smtp.writetimeout: 10000
      mail.smtp.connectiontimeout: 10000
      mail.smtp.starttls.enable: true
      mail.smtp.starttls.required: true
      mail.smtp.socketFactory.port: 994 # 端口
      mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
      mail.smtp.socketFactory.fallback: false

我这边是以网易的域名邮箱为例子的,需要注意的是,网易的域名邮箱只提供了SSL加密,而不提供TLS加密,所以我这边单独设置了mail.smtp.socketFactory.port,而把port给注释了;如果大家的服务商提供了TLS加密,那么只填写port就行了。

使用

我这边首先创建个Service,并注入JavaMailSender

@Service
public class MailService {
    @Value("${spring.mail.username}")
    private String MailUserName;

    private JavaMailSender javaMailSender;

    @Resource
    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

}

发送简单的邮件

public void sendSimpleMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
        message.setFrom("Test<" + MailUserName + ">"); // 发送邮件的用户名称
        message.setTo("xxx@xxx.com"); // 邮件发送给谁
        message.setSubject("简单的邮件"); // 邮件的标题
        // message.setText("Test"); 仅文本内容
        message.setText("<h1>Test</h1>", true); // 带HTML的内容
        javaMailSender.send(mimeMessage);
}

发送带副本的邮件

public void sendSimpleMail() throws MessagingException {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom("Test<" + MailUserName + ">");
        helper.setTo("xxx@xxx.com");
        helper.setSubject("带文件的邮件");
        helper.setText("<h1>Test</h1>", true);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
        helper.addAttachment(fileName, file);
        javaMailSender.send(mimeMessage);
}

HTML邮件进阶

有个很常见的用途,就是用户注册的时候给用户发送一封欢迎邮件,邮件里面肯定会包含用户的相关信息,这里的信息可以看作是一个变量,那么问题来了,我们应该如何让邮件里面包含这个”变量“呢?我想最简单的实现方式应该就是拼接字符串了,但是这样的问题在于不直观,不好维护,并且在代码里面出现一长串字符串也不好看。但邮件内容既然是HTML,那么我们能不能用HTML解析框架来返回一个HTML字符串呢?那么我们就可以直接把邮件的模板写在HTML文件内由框架来帮我们替换相关的变量,这样就直观很多了。

要实现这样的操作也很简单,我这里使用thymeleaf这个框架来解析HTML。(这个框架如果是在SpringBoot直接返回网页内容的项目中应该也是用得很广泛的)

首先还是添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

之后还是在application.yml中写配置

spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html

然后我们创建相关的文件夹resources/templates/mail,再在mail文件夹内新建HTML,我这里就叫welcome.html,然后在里面写HTML即可

<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Test</title>
    <meta charset="utf-8">
</head>
<div>
    <table style="font-family: Segoe UI, SegoeUIWF, Arial, sans-serif; font-size: 12px; color: #333333; border-spacing: 0; border-collapse: collapse; padding: 0; width: 580px; direction: ltr">
        <tbody>
        <tr style="background-color: #0078D4">
            <td style="padding: 0">
                <table style="font-family: Segoe UI, SegoeUIWF, Arial, sans-serif; border-spacing: 0; border-collapse: collapse; width: 100%">
                    <tbody>
                    <tr>
                        <td style="font-size: 38px; color: #FFFFFF; padding: 12px 22px 4px 22px" colspan="3">
                            Test
                        </td>
                    </tr>
                    <tr>
                        <td style="font-size: 20px; color: #FFFFFF; padding: 0 22px 18px 22px" colspan="3"
                            th:text="${username}+' 测试邮件'"> <!-- 注意这行 -->
                            用户 测试邮件
                        </td>
                    </tr>
                    </tbody>
                </table>
            </td>
        </tr>
        </tbody>
    </table>
</div>

需要注意的是邮件里面写的HTML是有一定限制的,具体的可以百度,我这里用的是微软的模板。

解释一下th:text="${username}+' 测试邮件'"${username}对应后面在Java中传递的参数的名字,解析之后会把“用户 测试邮件”替换成“${username} 测试邮件”,更多详细的解释可以搜一下thymeleaf的用法。

最后修改一下MailService

@Service
public class MailService {
    @Value("${spring.mail.username}")
    private String MailUserName;

    private JavaMailSender javaMailSender;
    private TemplateEngine templateEngine;

    @Resource
    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Autowired
    public void setTemplateEngine(TemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
    }

    public void sendWelcomeMail() throws MessagingException {
        Context context = new Context();
        context.setVariable("username", "测试用户"); // 这里对应HTML中的${username}
        String mailContent = templateEngine.process("mail/welcome", context); // 这里对应我们新建的HTML文件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
        message.setFrom("Test<" + MailUserName + ">");
        message.setTo("xxx@xxx.com");
        message.setSubject("HTML解析测试邮件");
        message.setText(mailContent, true);
        javaMailSender.send(mimeMessage);
    }
}

最后调用一下sendWelcomeMail()就能查看效果咯。

参考

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇