SpringBoot发送文字邮件和html类型邮件

引入邮件相关依赖

<!--springboot邮件发送-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

在application.yml添加配置,其中username以及password是用来发送邮件的账号和密码

:我这里使用的是腾讯企业邮箱实现的自定义域名邮箱,如果使用的是正常qq号申请的qq邮箱,需要在账号-设置中开启IMAP/SMTP服务,且需要使用qq邮箱里面提供的授权码作为password。(其他邮箱差不多,自行查看各个邮箱的帮助文档)

spring:
  mail:
    default-encoding: utf-8
    host: smtp.exmail.qq.com
    username: admin@3kkg.com
    password: password
    port: 587
    protocol: smtp

到这里我们已经可以在项目中进行邮件的发送了,那么如何发送呢?见代码:

@Autowired
private JavaMailSender jms;

在需要发件的地方注入JavaMailSender对象进行邮件的发送。

@Test
public void textMail() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom(myMail);
    message.setTo(toMail);
    message.setSubject("textMail发送");
    message.setText("内容123456");
    jms.send(message);
}

其中setFrom设置发件人的账号,也就是我们项目中配置的账号。setTo设置发送到哪个邮箱,也就是收件人的账号。

Subject是邮件标题,Text是邮件内容。

我们经常见到另外一种邮件发送模式是像网页一样有排版的,这种邮件我们需要使用MimeMessage这个类来实现发送,见代码:

@Test
public void htmlMail() {
    MimeMessage mimeMessage = jms.createMimeMessage();
    try {
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        messageHelper.setFrom(myMail);
        messageHelper.setTo(toMail);
        messageHelper.setSubject("htmlMail发送");
        String html = "";
        messageHelper.setText(html, true);
        jms.send(mimeMessage);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

跟文字版发送没有太大区别,只是发送的对象变成了MimeMessage并且使用MimeMessageHelper来实现对MimeMessage的设置。

需要注意的是,在setText方法中,第二个参数需要为true。html这个变量的值就是整个网页的代码,且网页的样式最好不要使用引用的方式引入css,在某些邮件上会出现样式丢失。

对于html代码的获取,这里介绍一下使用enjoy模板引擎进行获取的办法:

引入enjoy的依赖

<!--jfinal的enjoy模板-->
<dependency>
    <groupId>com.jfinal</groupId>
    <artifactId>enjoy</artifactId>
    <version>4.3</version>
</dependency>

配置一个专门用来邮件发送的enjoy中的Engine,这里为了方便我直接在单元测试方法中进行创建,实际项目中可以参考这篇配置在EnjoyConfig类中。

@Before
public void befor(){
    ClassPathSourceFactory classPathSourceFactory = new ClassPathSourceFactory();
    Engine.create("mail")
            .setBaseTemplatePath("/templates/")
            .setDatePattern("yyyy-MM-dd HH:mm:ss")
            .setSourceFactory(classPathSourceFactory);
}

在resources目录下创建邮件的html模板。/resources/templates/notice.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>邮件通知模板</title>
</head>
<body style="color: #666;">
<div style="width: 80%;
            max-width: 800px;
            min-width: 600px;">
    <div style="margin-left: 10px;">
        <h1>#(title)</h1>
    </div>
    <div style="border-radius: 10px;
                border: 1px solid #ddd;
                padding: 15px 15px 20px;
                min-height: 200px;">
        #(content)
    </div>
    <div style="text-align: right;
                color: #999;
                padding: 10px 15px 15px;">
        #(time)
    </div>
</div>
</body>
</html>

使用如下代码进行html代码的获取并设置模板中需要设置的值

Template template = Engine.use("mail").getTemplate("notice.html");
Map<String, Object> data = MapUtil.newHashMap();
data.put("title", title);
data.put("time", DateUtil.now());
data.put("content", content);
String html = template.renderToString(data);

到这html网页样式的邮件也可以实现发送了。


完整的代码请参考:https://gitee.com/floow/blog-demo demo10 中的单元测试方法。