27

SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式

 3 years ago
source link: http://www.cnblogs.com/swzx-1213/p/12856056.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

往期推荐

SpringBoot系列(一)idea新建Springboot项目

SpringBoot系列(二)入门知识

springBoot系列(三)配置文件详解

SpringBoot系列(四)web静态资源配置详解

SpringBoot系列(五)Mybatis整合完整详细版

SpringBoot系列(六)集成thymeleaf详解版

Springboot系列(七) 集成接口文档swagger,使用,测试

SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

SpringBoot系列(九)单,多文件上传的正确姿势

SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

SpringBoot系列(十二)过滤器配置详解

SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

目录:

  • 二、开启SMTP服务并获取授权码
  • 三、依赖导入与配置说明
    • 2. 带附件内容和正文带图片的邮件发送
    • 3. thymeleaf模板作为邮件发送

一、SMTP协议简介

SMTP是一种提供可靠且有效的 电子邮件传输 的协议。SMTP是建立在 FTP 文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能 跨越网络传输邮件 ,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。

简单来说:我们使用的这些邮件发送功能,他们之间都有一个专门的电子邮件的服务器,类似于邮局,你将邮件发给邮局,邮局又会根据你的邮寄地址发送给相应的邮局,然后接收方去邮局取邮件。而邮件服务器呢,就是互联网之间的一个邮局,不同的网络之间也能实现电子邮件的发送。

Spring框架在java邮件服务的基础上进行了封装,SpringBoot在Spring的基础上对邮件服务进一步的封装,让SpringBoot发送邮件更为便利,灵活。

二、开启SMTP服务并获取授权码

这里我们以 QQ邮箱 为例,要想在SpringBoot发送QQ邮件必须先打开QQ邮箱的SMTP功能,默认是关闭的,具体操作如下。进入邮箱→设置→账户,然后找到下面这个:

zUzumaU.png!web

将第一个开启,这里我已经开启了,就不用再开启了,至于那个POP3协议,这是一种从邮件服务器上读取邮件的协议,通过POP3协议,收信人不需要参与到与邮件服务器之间的邮件读取过程,简化了用户操作. 收信人可以“离线”地进行邮件处理,很方便地接收,阅读邮件。

然后我们开启之后还需要获取一个授权码,这个授权码我们后面编写邮件配置需要用到。获取授权码可能需要验证身份什么的。将授权码保存下来。

B7jUv2Z.png!web

三、依赖导入与配置说明

依赖导入:

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

为了方便测试我们也需要将 starter-web 的依赖导入进来。

配置文件:

spring:
  mail:
    host: smtp.qq.com
    username: [email protected]
    password: zxcvbnmkj
    properties:
      mail:
        smtp:
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
##         ssl:
##           enable :true
    default-encoding: utf-8

配置说明:

  • host就是你的邮件服务器地址,
  • username就是你的邮箱账号,带上后缀
  • password就是你刚刚复制的授权码,我这里是乱写的;
  • default-encoding 设置邮件的编码为utf-8;
  • properties:额外的配置,这里我写了两个,只用其中一个就行了,开启ssl加密,保证安全连接。

四、邮件发送

1.简单邮件发送

编写controller,或者是直接在测试模块添加测试就行

@RestController
public class MailController {
    @Autowired
    JavaMailSenderImpl javaMailSender;
    @RequestMapping("/mail")
    public String sendMail(){
        SimpleMailMessage message = new SimpleMailMessage();
        //邮件设置
        message.setSubject("邮件主题");
        message.setText("邮件内容");
        message.setTo("[email protected]","[email protected]");
        message.setFrom("[email protected]");
        javaMailSender.send(message);
        return "简单邮件发送成功!"
    }
}

代码说明: JavaMailSenderImpl 就是一个SpringBoot中用来发送邮件的一个实现类,我们需要将它注入到bean中,以供使用。它里面有一些方法,这里只展示了简单的几个,其他的也很简单,比如说发送日期,抄送人等等。接受者可以设置多个,如上。

2. 带附件内容和正文带图片的邮件发送##

@RequestMapping("/mineMail")
public String sendMineMail() throws MessagingException {
     //1、创建一个复杂的邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        //邮件主题
        helper.setSubject("这是一个邮件啊");
        //文本中添加图片
        helper.addInline("image1",new FileSystemResource("D:\\images\\spring\\1.jpg"));
        //邮件内容
        helper.setText("全栈学习笔记<a href='https://www.cnblogs.com/swzx-1213/'>百度一下</a>    <img src='cid:image1'></img>",true);
        helper.setTo("[email protected]");
        helper.setFrom("[email protected]");
        //附件添加图片
        helper.addAttachment("1.jpg",new File("D:\\images\\spring\\1.jpg"));
        //附件添加word文档
        helper.addAttachment("哈哈哈.docx",new File("D:\\images\\spring\\哈哈哈.docx"));

        javaMailSender.send(mimeMessage);
       return "复杂邮件发送!";
}

代码说明:

  • 创建一个MimeMessage 邮件,但是我们也需要创建一个工具类MimeMessageHelper,相当于代理类吧,邮件的属性配置就由这个工具类来实现。
  • addInline() ,第一个参数是一个contentId,String类型的,相当于是一个key,第二个参数是一个Resource对象,资源对象,这里我们传了一个本地的图片就用的FileSystemResource对象。当然这里是说的我们用的这个addInline方法的参数是这样,还有其他的参数类型,所谓重载。
  • setText() ,这里用到的第一个参数就是文本字符串,第二个就是是否解析文本中的html语法。
  • addAttachment() 这个方法是用来添加附件的,附件和我们之前添加的图片不一样,附件作为一种未下载的文件,而资源文件则是直接显示到正文中。利用我自己的邮箱进行测试的截图:

UJRBzej.png!web

3. thymeleaf模板作为邮件发送

项目中需要引入thymeleaf依赖,并且要在新建的html文件中加入:xmlns:th=" http://www.thymeleaf.org " ,不会thymeleaf的请移步之前的文章。

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

这里在templates下面创建了一个email的html5文件。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<p th:text="${name}"></p>
<a th:text="这是一个链接" th:href="${link}"></a>
<img th:src="${image1}">
</body>
</html>

controller中再添加一个方法。

@RequestMapping("/thyMail")
    public String sendThymeleafMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
        messageHelper.setSubject("这是一个thymeleaf模板邮件");
        messageHelper.setTo("[email protected]");
        messageHelper.setFrom("[email protected]");
        Context context = new Context();
        context.setVariable("name","这是一个新建的thymeleaf模板");
        context.setVariable("link","https://www.cnblogs.com/swzx-1213/");
        context.setVariable("image1","https://s1.ax1x.com/2020/04/14/JShDYt.th.jpg");
        String value = templateEngine.process("email.html",context);
        messageHelper.setText(value,true);
        javaMailSender.send(mimeMessage);
        return "模板邮件发送成功";
    }

代码说明:

  • Context 属于org.thymeleaf.context这个包。
  • context.setVariable() ,第一个参数是String,第二个是Object类型。第一个参数就对应thymeleaf模板上面相同名字的参数。
  • templateEngine.process() 将指定路径的html文件转换成String类型返回。

测试:

mAFfYjV.png!web

五、总结

本文讲了基础的邮件发送原理,SMTP协议以及提到的POP3协议的概要内容。然后一起引入依赖,添加项目属性配置,最后讲解了三大类发送邮件的方式。源码获取看下面!

If673yr.png!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK