Spring boot学习(九)Spring boot配置邮件发送

前言

邮件发送这一功能在实际的项目中使用的是非常普遍的,用户忘记账户忘记密码等很多操作都是通过邮件的方式来交互,因此邮件发送在web开发中是必不可少一个功能模块,本文就主要介绍如何在spring boot中发送不同类型的邮件。

文章首发于个人博客:【http://www.xiongfrblog.cn

Spring boot中配置步骤

Spring本身提供了很好用的org.springframework.mail.javamail.JavaMailSender接口来实现邮件发送功能,Spring boot中也为此提供了自动化配置,所以我们使用起来非常方便。

添加依赖

首先在pom.xml文件中添加如下依赖:

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

修改配置文件

添加依赖之后就需要在项目配置文件application.properties中配置发送邮件相关的参数,具体如下:

spring.mail.host=smtp.163.com
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8

重要的参数就这些,其它的使用默认的即可,以下为解释:

  • spring.mail.host:邮箱服务器地址,这个根据自己使用什么邮箱有区别,比如:
    1. smtp.163.com:163邮箱
    2. smtp.126.com:126邮箱
    3. smtp.qq.com:qq邮箱
  • spring.mail.username:邮箱登陆用户名。
  • spring.mail.password:第三方登陆授权码(下面会具体介绍该授权码的获取方式)。
  • spring.mail.default-encoding:编码方式

POP3/SMTP服务

上面提到了授权码的概念,首先要明确一个概念就是授权码跟我们直接登陆邮箱的密码不是一样的,授权码可以理解为第三方客户端登陆邮箱的密码,要想获取授权码需要我们去自己所用邮箱的官网设置开启POP3/SMTP以及IMAP/SMTP服务,我这里就以自己使用的163账号为例介绍打开该服务以及获取授权码的步骤,如图:

在这里插入图片描述

登陆163邮箱官网,按照图示步骤进行操作,在选择了服务之后会给你发送验证码,输入验证码之后就会让你自己设置授权码,这里的授权码就是上边配置文件中spring.mail.password需要填写的值。

封装邮件工具类

对邮件的操作最好是封装一个类以便代码重用以及维护,我这里封装成一个service层。

定义接口IMailService.interface

package com.web.springbootmail.service;
/**
* @author Promise
* @createTime 2019年3月30日 下午3:14:14
* @description 
*/
public interface IMailService {
    
    /**
     * 简单文本邮件
     * @param toUser 邮件接收者
     */
    void simpleMil(String toUser)throws Exception;
    
    /**
     * html邮件
     * @param toUser 邮件接收者
     */
    void htmlMail(String toUser) throws Exception;
    
    /**
     * 带附件邮件
     * @param toUser 邮件接收者
     */
    void attachmentMail(String toUser)throws Exception;
    
    /**
     * 带图片邮件
     * @param toUser 邮件接收者
     */
    void imgMail(String toUser)throws Exception;
    
    /**
     * 模板邮件
     * @param toUser 邮件接收者
     */
    void TemplateMail(String toUser)throws Exception;
    
}

实现类MailServiceimpl.java:

package com.web.springbootmail.service.impl;

import java.io.File;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import com.web.springbootmail.service.IMailService;

/**
* @author Promise
* @createTime 2019年3月30日 下午3:14:37
* @description  邮件发送服务类
*/
@Service("mailService")
public class MailServiceImpl implements IMailService{
    
    @Autowired
    private JavaMailSender jms;
    
    @Autowired
    private TemplateEngine templateEngine;
    
    @Value("${spring.mail.username}")
    private String from;

    @Override
    public void simpleMil(String toUser) {
        
    }

    @Override
    public void htmlMail(String toUser) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void attachmentMail(String toUser) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void imgMail(String toUser) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void TemplateMail(String toUser) {
        // TODO Auto-generated method stub
        
    }

}

这里只给出了框架,具体实现下面依次介绍,上面还注入了三个变量:

  • jms:邮件发送接口
  • templateEngine:发送模板邮件时解析模板
  • from:读取配置文件中配置的邮件发送者的账号

下面介绍每一种邮件的具体实现

简单文本邮件

这一类邮件最简单,使用SimpleMailMessage对象,代码如下:

@Override
public void simpleMil(String toUser) {
    // TODO Auto-generated method stub
    //初始化简单邮件对象
    SimpleMailMessage message = new SimpleMailMessage();
    //邮件发送者
    message.setFrom(from);
    //邮件接收者
    message.setTo(toUser);
    //邮件标题
    message.setSubject("简单邮件");
    //邮件内容
    message.setText("简单内容");
    //发送邮件
    jms.send(message);
}

html邮件

这一类邮件使用的是MimeMessage对象,可丰富页面样式,代码如下:

@Override
public void htmlMail(String toUser) throws MessagingException {
    // TODO Auto-generated method stub
    MimeMessage message = jms.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(toUser);
    helper.setSubject("html格式邮件");
    //内容为html格式
    String content = "<p style='color:yellow;'>这是一封html格式的文件</p><h1>这是一封html格式的文件</h1>";
    //true表示以html格式发送邮件
    helper.setText(content, true);
    jms.send(message);
}

带附件的邮件

这一类邮件多了添加附件的过程,也使用MimeMessage,代码如下:

@Override
public void attachmentMail(String toUser) throws MessagingException {
    // TODO Auto-generated method stub
    MimeMessage message = jms.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(toUser);
    helper.setSubject("带附件邮件");
    //加载绝对路径资源
    FileSystemResource fs = new FileSystemResource(new File("D:\\DownLoad\\file\\阿里巴巴Java开发手册v1.2.0.pdf"));
    helper.setText("这是一封带附件的邮件!");
    //添加附件资源
    helper.addAttachment("阿里巴巴Java开发手册v1.2.0.pdf", fs);
    jms.send(message);
}

这里的文件路径本地文件的绝对路劲。

带图片的邮件

代码如下:

@Override
public void imgMail(String toUser) throws MessagingException {
    // TODO Auto-generated method stub
    MimeMessage message = jms.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(toUser);
    helper.setSubject("带图片邮件");
    //设置资源的cid
    String content = "<html><body>博客头像<img src='cid:img'/></body></html>";
    helper.setText(content, true);
    FileSystemResource fs = new FileSystemResource(new File("D:\\DownLoad\\img\\20171123181522_c48800.jpg"));
    //和上边的cid要对应
    helper.addInline("img", fs);
    jms.send(message);
}

其实这种方式也是html邮件,只是多了静态资源,比如我们这里就在页面上添加了一张图片,步骤跟添加附件有点类似,但是需要注意的是静态资源需要给静态资源设置cid,以便存在多个静态资源区分。

模板邮件

模板邮件指的是邮件的主体内容都是一样的,只是有一部分不一样,这样我们就可以定义一个邮件的模板,发送邮件的时候我们直接传入参数就可以了,是一种很好的封装。

这里我使用的模板解析框架为thymeleaf,所以需要先在项目pom.xml文件中添加依赖:

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

接下来在src/main/resources/templates目录下新建MailTemplate.html文件,内容如下:

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>您好,<span th:text="${username}"></span>:这是来自测试的邮件模板!</h2>
</body>
</html>

使用具体代码如下:

@Override
public void TemplateMail(String toUser) throws MessagingException {
    // TODO Auto-generated method stub
    MimeMessage message = jms.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    helper.setFrom(from);
    helper.setTo(toUser);
    helper.setSubject("模板邮件");
    Context context = new Context();
    //给模板传入参数,username要与模板中变量名一致,promise为测试数据
    context.setVariable("username", "promise");
    //thymeleaf模板默认会从src/main/resources/tempaltes目录下寻找文件,填入我们定义的模板名,不需要写后缀。
    String template = templateEngine.process("MailTemplate", context);
    helper.setText(template, true);
    jms.send(message);
}

controller调用

封装好了发送邮件的工具类之后,我们直接在controller调用即可,代码如下:

package com.web.springbootmail.controller;

import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.web.springbootmail.service.IMailService;

/**
* @author Promise
* @createTime 2019年4月1日 下午9:30:38
* @description  邮件发送
*/
@RequestMapping("/mail")
@RestController
public class EmailController {
    
    @Autowired
    private IMailService mailService;
    
    @GetMapping("/simple")
    public Map<String, Object> sendSimpleMail() {
        Map<String, Object> map =new HashMap<>();
        try {
            //参数就是接收邮件的邮箱,根据自己实际填写
            mailService.simpleMil("*****@qq.com");
            map.put("res", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            map.put("res", "error");
        }
        return map;
    }
    
    @GetMapping("/htmlMail")
    public Map<String, Object> htmlMail(){
        Map<String, Object> map =new HashMap<>();
        try {
            mailService.htmlMail("*****@qq.com");
            map.put("res", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            map.put("res", "error");
        }
        return map;
    }
    
    @GetMapping("/attachmentsMail")
    public Map<String, Object> attachmentsMail(){
        Map<String, Object> map =new HashMap<>();
        try {
            mailService.attachmentMail("*****@qq.com");
            map.put("res", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            map.put("res", "error");
        }
        return map;
    }
    
    @GetMapping("/imgMail")
    public Map<String, Object> imgMail(){
        Map<String, Object> map =new HashMap<>();
        try {
            mailService.imgMail("*****@qq.com");
            map.put("res", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            map.put("res", "error");
        }
        return map;
    }
    
    @GetMapping("/templateMail")
    public Map<String, Object> templateMail(){
        Map<String, Object> map =new HashMap<>();
        try {
            mailService.TemplateMail("*****@qq.com");
            map.put("res", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            map.put("res", "error");
        }
        return map;
    }
}

效果测试

简单邮件效果

启动项目,访问localhost:8080/mail/simple,此时我的收件箱收到如下邮件:

在这里插入图片描述

html邮件

访问localhost:8080/mail/htmlMail,效果如下:

在这里插入图片描述

带附件邮件

访问localhost:8080/mail/attachmentsMail,效果如下:

在这里插入图片描述

带图片邮件

访问localhost:8080/mail/imgMail,效果如下:

在这里插入图片描述

模板邮件

访问localhost:8080/mail/templateMail,效果如下:

在这里插入图片描述

结语

好了,关于spring boot配置邮件发送功能就到这里了,感谢阅读,bye~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容