目录

  • 电子邮件与Java发送邮件的历史
  • 电子邮件原理
    • 电子邮件服务器
    • 电子邮箱
    • 邮件客户端
    • 邮件传输协议
    • 邮件格式
    • 电子邮件发送和接收流程
  • 电子使用场景
  • SpringBoot实现发送电子邮件
    • 准备账号
    • 构建项目并配置
    • 实现服务端代码
    • 新建邮件模板
    • 测试发送邮件
  • 总结
  • 相关链接

从1969年10月世界上的第一封电子邮件发出,到2019年,已经过去将近半个世纪了。虽然即时通讯和视频会议,甚至全息投影都变得日益普及,但电子邮件依然有着广泛的使用场景和不可撼动的历史地位。

SpringBoot拥有强大的生态链,几乎可以连接所有主流的开源库。

下面我们就从电子邮件发送的历史再到原理,然后如何自己配置邮件服务器并发送邮件,一步步讲解。

本文实现源码可以在这里找到: SpringBoot发送电子邮件源码

电子邮件与Java发送邮件的历史

  1. 1969年10月,世界上的第一封电子邮件

1969年10月世界上的第一封电子邮件是由计算机科学家Leonard K.教授发给他的同事的一条简短消息。第一条网上信息就是‘LO’,意思是‘你好!’。

  1. 1987年9月14日中国的第一封电子邮件

在此之后,1987年9月14日中国的第一封电子邮件,这封邮件是由德国维尔纳·措恩与中国的王运丰在北京计算机应用技术研究所,发往德国一个大学的,邮件内容颇具深意,“Across the Great Wall we can reach every corner in the world.(越过长城,走向世界)”,这是中国通过北京与德国大学之间的网络连接,向全球科学网发出的第一封电子邮件。

  1. 30年代发展历程

接下来中国的电子邮件进入了30年的发展期,虽然在1987年就有了电子邮件,但是,真正的邮件兴起,应该在90年代到2000年之间,因为在1987的时候中国网速特别慢,真正能接触到互联网的用户是非常少的,到了90年代中期,互联网浏览器的诞生,使得全民上网人数激增,电子邮件被广泛使用,此时,中国的部分学生在研究中使用到电子邮件,真正普及的时间是在2000年左右。

  1. Java发送邮件

Java在发明之初,就开始支持发送邮件,通过java mail包方式去操作邮件发送的内容和协议,但是,这种发送方式稍微比较复杂,需要配置各种参数、协议、内容,之后产生了Spring框架。

  1. Spring发送邮件

Spring在java mail的基础上进行了一些封装,使发送邮件的过程的复杂大大减少。

  1. SpringBoot发送邮件

SpringBoot Mail在Spring Mail的基础上,再次进行一次封装,使得发送邮件的便利度上,更为简单。

电子邮件原理

电子邮件服务器

用户要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。这些邮件服务器就类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

邮件服务器就好像是互联网世界的邮局。按照功能划分,邮件服务器可以划分为两种类型:

  1. SMTP邮件服务器:用户替用户发送邮件和接收外面发送给本地用户的邮件。
  2. POP3/IMAP邮件服务器:用户帮助用户读取SMTP邮件服务器接收进来的邮件。

电子邮箱

电子邮箱也称为E-mail地址,用户可以通过E-mail地址来标识自己发送的电子邮件,也可以通过这个地址接收别人发来的电子邮件。电子邮箱需要到邮件服务器进行申请,也就是说,电子邮箱其实就是用户在邮件服务器上申请的账户。邮件服务器会把接收到的邮件保存到为该账户所分配的邮箱空间中,用户通过用户名密码登录到邮件服务器查收该地址已经收到的邮件。一般来讲,邮件服务器为用户分配的邮箱空间是有限的。

邮件客户端

我们可以直接在网站上进行邮件收发,也可以使用常见的FoxMail、Outlook等邮件客户端软件接受邮件。邮件客户端软件通常集邮件撰写、发送和收发功能于一体,主要用于帮助用户将邮件发送给SMTP邮件服务器和从POP3/IMAP邮件服务器读取用户的电子邮件。

邮件传输协议

电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议。下面我们分别简单介绍几种协议:

  1. SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
  2. POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则。
  3. IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则。

邮件格式

要想各种邮件处理程序能识别我们所写的电子邮件,能从我们所书写的电子邮件中分析和提取出发件人、收件人、邮件主题和邮件内容以及附件等信息,那么我们所写的电子邮件必须要遵循一定的格式要求,而这种邮件内容的基本格式和具体细节分别是由 RFC822 文档和 MIME 协议定义的。

  1. RFC822 文档中定义的文件格式包括两个部分:邮件头和邮件体。
  2. MIME协议(Multipurpose Internet Mail Extensions )用于定义复杂邮件体的格式,它可以表达多段平行的文本内容和非文本的邮件内容,例如,在邮件体中内嵌的图像数据和邮件附件等。另外,MIME协议的数据格式也可以避免邮件内容在传输过程中发生信息丢失。MIME协议不是对RFC822邮件格式的升级和替代,而是基于RFC822邮件格式的扩展应用。一言以蔽之,RFC822定义了邮件内容的格式和邮件头字段的详细细节,MIME协议则是定义了如何在邮件体部分表达出的丰富多样的数据内容。

电子邮件发送和接收流程

图示的六个步骤分别进行如下的说明:

①用户A的电子邮箱为:xx@qq.com,通过邮件客户端软件写好一封邮件,交到QQ的邮件服务器,这一步使用的协议是SMTP,对应图示的①;

②QQ邮箱会根据用户A发送的邮件进行解析,也就是根据收件地址判断是否是自己管辖的账户,如果收件地址也是QQ邮箱,那么会直接存放到自己的存储空间。这里我们假设收件地址不是QQ邮箱,而是163邮箱,那么QQ邮箱就会将邮件转发到163邮箱服务器,转发使用的协议也是SMTP,对应图示的②;

③163邮箱服务器接收到QQ邮箱转发过来的邮件,也会判断收件地址是否是自己,发现是自己的账户,那么就会将QQ邮箱转发过来的邮件存放到自己的内部存储空间,对应图示的③;

④用户A将邮件发送了之后,就会通知用户B去指定的邮箱收取邮件。用户B会通过邮件客户端软件先向163邮箱服务器请求,要求收取自己的邮件,对应图示的④;

⑤163邮箱服务器收到用户B的请求后,会从自己的存储空间中取出B未收取的邮件,对应图示⑤;

⑥163邮箱服务器取出用户B未收取的邮件后,将邮件发给用户B,对应图示的⑥;最后三步用户B收取邮件的过程,使用的协议是POP3;

电子邮件的使用场景

在系统中电子邮件的使用场景:

  1. 注册验证

  2. 营销推送

  3. 触发机制

  4. 监控报警

电子邮件是业务和安全的最后一道防线 —— 当系统无法自动处理的时候,通过邮件提醒相关支持人员。

SpringBoot实现发送电子邮件

准备账号

注册发件邮箱并设置客户端授权码,这里以163免费邮箱为例:

构建项目并配置

搭建完项目以后,进行下面的两步配置。

application.properties配置参数:

# 邮箱配置
spring.mail.host=smtp.163.com
# 你的163邮箱
spring.mail.username=ispringboot@163.com
# 注意这里不是邮箱密码,而是SMTP授权密码
spring.mail.password=isb001
spring.mail.port=25
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

pom.xml依赖spring-boot-starter-mail模块:

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

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

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

实现服务端代码

MailService.java:

package org.ijiangtao.tech.spring.boot.mail.imail.service;

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.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 javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@Service
public class MailService {

<span class="token keyword">private</span> <span class="token keyword">final</span> Logger logger <span class="token operator">=</span> LoggerFactory<span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token annotation punctuation">@Value</span><span class="token punctuation">(</span><span class="token string">"${spring.mail.username}"</span><span class="token punctuation">)</span>
<span class="token keyword">private</span> String from<span class="token punctuation">;</span><span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> JavaMailSender mailSender<span class="token punctuation">;</span><span class="token comment">/*** 简单文本邮件* @param to 接收者邮件* @param subject 邮件主题* @param contnet 邮件内容*/</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendSimpleMail</span><span class="token punctuation">(</span>String to<span class="token punctuation">,</span> String subject<span class="token punctuation">,</span> String contnet<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>SimpleMailMessage message <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SimpleMailMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>message<span class="token punctuation">.</span><span class="token function">setTo</span><span class="token punctuation">(</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span>message<span class="token punctuation">.</span><span class="token function">setSubject</span><span class="token punctuation">(</span>subject<span class="token punctuation">)</span><span class="token punctuation">;</span>message<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>contnet<span class="token punctuation">)</span><span class="token punctuation">;</span>message<span class="token punctuation">.</span><span class="token function">setFrom</span><span class="token punctuation">(</span>from<span class="token punctuation">)</span><span class="token punctuation">;</span>mailSender<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token comment">/*** HTML 文本邮件* @param to 接收者邮件* @param subject 邮件主题* @param contnet HTML内容* @throws MessagingException*/</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendHtmlMail</span><span class="token punctuation">(</span>String to<span class="token punctuation">,</span> String subject<span class="token punctuation">,</span> String contnet<span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span>MimeMessage message <span class="token operator">=</span> mailSender<span class="token punctuation">.</span><span class="token function">createMimeMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>MimeMessageHelper helper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MimeMessageHelper</span><span class="token punctuation">(</span>message<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setTo</span><span class="token punctuation">(</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setSubject</span><span class="token punctuation">(</span>subject<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>contnet<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setFrom</span><span class="token punctuation">(</span>from<span class="token punctuation">)</span><span class="token punctuation">;</span>mailSender<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token comment">/*** 附件邮件* @param to 接收者邮件* @param subject 邮件主题* @param contnet HTML内容* @param filePath 附件路径* @throws MessagingException*/</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendAttachmentsMail</span><span class="token punctuation">(</span>String to<span class="token punctuation">,</span> String subject<span class="token punctuation">,</span> String contnet<span class="token punctuation">,</span>String filePath<span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span>MimeMessage message <span class="token operator">=</span> mailSender<span class="token punctuation">.</span><span class="token function">createMimeMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>MimeMessageHelper helper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MimeMessageHelper</span><span class="token punctuation">(</span>message<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setTo</span><span class="token punctuation">(</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setSubject</span><span class="token punctuation">(</span>subject<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>contnet<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setFrom</span><span class="token punctuation">(</span>from<span class="token punctuation">)</span><span class="token punctuation">;</span>FileSystemResource file <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileSystemResource</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>filePath<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>String fileName <span class="token operator">=</span> file<span class="token punctuation">.</span><span class="token function">getFilename</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">addAttachment</span><span class="token punctuation">(</span>fileName<span class="token punctuation">,</span> file<span class="token punctuation">)</span><span class="token punctuation">;</span>mailSender<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token comment">/*** 图片邮件* @param to 接收者邮件* @param subject 邮件主题* @param contnet HTML内容* @param rscPath 图片路径* @param rscId 图片ID* @throws MessagingException*/</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendInlinkResourceMail</span><span class="token punctuation">(</span>String to<span class="token punctuation">,</span> String subject<span class="token punctuation">,</span> String contnet<span class="token punctuation">,</span>String rscPath<span class="token punctuation">,</span> String rscId<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>logger<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"发送静态邮件开始: {},{},{},{},{}"</span><span class="token punctuation">,</span> to<span class="token punctuation">,</span> subject<span class="token punctuation">,</span> contnet<span class="token punctuation">,</span> rscPath<span class="token punctuation">,</span> rscId<span class="token punctuation">)</span><span class="token punctuation">;</span>MimeMessage message <span class="token operator">=</span> mailSender<span class="token punctuation">.</span><span class="token function">createMimeMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>MimeMessageHelper helper <span class="token operator">=</span> null<span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{<!-- --></span>helper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MimeMessageHelper</span><span class="token punctuation">(</span>message<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setTo</span><span class="token punctuation">(</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setSubject</span><span class="token punctuation">(</span>subject<span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setText</span><span class="token punctuation">(</span>contnet<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">setFrom</span><span class="token punctuation">(</span>from<span class="token punctuation">)</span><span class="token punctuation">;</span>FileSystemResource res <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileSystemResource</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>rscPath<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>helper<span class="token punctuation">.</span><span class="token function">addInline</span><span class="token punctuation">(</span>rscId<span class="token punctuation">,</span> res<span class="token punctuation">)</span><span class="token punctuation">;</span>mailSender<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>logger<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"发送静态邮件成功!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">MessagingException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>logger<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"发送静态邮件失败: "</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

新建邮件模板

我们使用thymeleaf作为模板引擎。

emailTeplate.html:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"/><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/><meta http-equiv="X-UA-Compatible" content="ie=edge"/><title>注册-测试邮件模板</title>
</head>
<body>你好,感谢你的注册,这是一封验证邮件,请点击下面的连接完成注册,感谢您的支持。<a href="#" th:href="@{https://github.com/{id}(id=${id})}">激活账户</a>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试发送邮件

测试发送邮件,使用单元测试MailServiceTest.java:

package org.ijiangtao.tech.spring.boot.mail.imail.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.mail.MessagingException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {

<span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> MailService mailService<span class="token punctuation">;</span><span class="token annotation punctuation">@Resource</span>
<span class="token keyword">private</span> TemplateEngine templateEngine<span class="token punctuation">;</span><span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendSimpleMail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>mailService<span class="token punctuation">.</span><span class="token function">sendSimpleMail</span><span class="token punctuation">(</span><span class="token string">"ispringboot@163.com"</span><span class="token punctuation">,</span><span class="token string">"测试spring boot imail-主题"</span><span class="token punctuation">,</span><span class="token string">"测试spring boot imail - 内容"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendHtmlMail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span>String content <span class="token operator">=</span> <span class="token string">"&lt;html&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;h3&gt;hello world&lt;/h3&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;h1&gt;html&lt;/h1&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;/html&gt;\n"</span><span class="token punctuation">;</span>mailService<span class="token punctuation">.</span><span class="token function">sendHtmlMail</span><span class="token punctuation">(</span><span class="token string">"ispringboot@163.com"</span><span class="token punctuation">,</span><span class="token string">"这是一封HTML邮件"</span><span class="token punctuation">,</span>content<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendAttachmentsMail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span>String filePath <span class="token operator">=</span> <span class="token string">"/ijiangtao/软件开发前景.docx"</span><span class="token punctuation">;</span>String content <span class="token operator">=</span> <span class="token string">"&lt;html&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;h3&gt;hello world&lt;/h3&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;h1&gt;html&lt;/h1&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;h1&gt;附件传输&lt;/h1&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;\n"</span> <span class="token operator">+</span><span class="token string">"&lt;/html&gt;\n"</span><span class="token punctuation">;</span>mailService<span class="token punctuation">.</span><span class="token function">sendAttachmentsMail</span><span class="token punctuation">(</span><span class="token string">"ispringboot@163.com"</span><span class="token punctuation">,</span><span class="token string">"这是一封HTML邮件"</span><span class="token punctuation">,</span>content<span class="token punctuation">,</span> filePath<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendInlinkResourceMail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span><span class="token comment">//TODO 改为本地图片目录</span>String imgPath <span class="token operator">=</span> <span class="token string">"/ijiangtao/img/blob/dd9899b4cf95cbf074ddc4607007046c022564cb/blog/animal/dog/dog-at-work-with-computer-2.jpg?raw=true"</span><span class="token punctuation">;</span>String rscId <span class="token operator">=</span> <span class="token string">"admxj001"</span><span class="token punctuation">;</span>String content <span class="token operator">=</span> <span class="token string">"&lt;html&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;h3&gt;hello world&lt;/h3&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;h1&gt;html&lt;/h1&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;h1&gt;图片邮件&lt;/h1&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;img src='cid:"</span><span class="token operator">+</span>rscId<span class="token operator">+</span><span class="token string">"'&gt;&lt;/img&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;body&gt;"</span> <span class="token operator">+</span><span class="token string">"&lt;/html&gt;"</span><span class="token punctuation">;</span>mailService<span class="token punctuation">.</span><span class="token function">sendInlinkResourceMail</span><span class="token punctuation">(</span><span class="token string">"ispringboot@163.com"</span><span class="token punctuation">,</span><span class="token string">"这是一封图片邮件"</span><span class="token punctuation">,</span>content<span class="token punctuation">,</span> imgPath<span class="token punctuation">,</span> rscId<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testTemplateMailTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> MessagingException <span class="token punctuation">{<!-- --></span>Context context <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Context</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>context<span class="token punctuation">.</span><span class="token function">setVariable</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">,</span><span class="token string">"ispringboot"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>String emailContent <span class="token operator">=</span> templateEngine<span class="token punctuation">.</span><span class="token function">process</span><span class="token punctuation">(</span><span class="token string">"emailTeplate"</span><span class="token punctuation">,</span> context<span class="token punctuation">)</span><span class="token punctuation">;</span>mailService<span class="token punctuation">.</span><span class="token function">sendHtmlMail</span><span class="token punctuation">(</span><span class="token string">"ispringboot@163.com"</span><span class="token punctuation">,</span><span class="token string">"这是一封HTML模板邮件"</span><span class="token punctuation">,</span>emailContent<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

测试结果,收到了电子邮件:

总结

在生产环境,一般邮件服务会单独部署,并通过HTTP或MQ等方式暴露出来。

相关链接

  • SpringBoot系列-前置知识
  • Github-JavaMail
  • imooc - SpringBoot发送电子邮件
  • SpringBoot发送电子邮件源码
  • 邮件发送的基本过程与概念
  • 邮件的组织结构

springboot实现发邮件相关推荐

  1. 八十一、使用Springboot实现发邮件的需求

    @Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 大家好,我是润森.期末化 ...

  2. springboot的应用(springboot+定时任务+发邮件)

    1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写了一个方法,注解里cron里面的很多星星意思是:每个月.周一到周日 .每个 ...

  3. 带着新人学springboot的应用10(springboot+定时任务+发邮件)

    接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...

  4. springboot 简单发邮件 QQ邮箱

    文章目录 pom yaml 发邮件 pom <dependency> <groupId>org.springframework.boot</groupId>< ...

  5. springboot定时发邮件

    1.发邮件,得先将邮件开启smtp,才可以发邮件 思路:先将数据库的数据下载保存到excel中,然后将附件的形式发送,其中利用到数据流 package com.example; import java ...

  6. springboot mail插件/JavaMailSenderImpl 发邮件。163网易企业邮箱调用的坑。

    前言 spring boot 2.0.0.RELEASE spring 5.0.4.RELEASE 网易企业邮箱 2019年版 jdk 1.8 发邮件的说明 按照加密方式方式,可以分为: 明文 TLS ...

  7. springboot项目系列-论坛系统06整合rabbitmq实现异步发邮件

    springboot项目系列-博客系统06整合rabbitmq实现异步发邮件 今天突发奇想,既然会了rabbitmq为何不用,之前的注册发邮件功能是使用springboot的异步任务做的,但是想想以后 ...

  8. SpringBoot高级-任务-邮件任务

    接下来测试邮件任务,在我们开发中也用的非常多,SpringBoot也加入了相关的场景支持,我们只需要引入spring-boot-starter-mail,加上一些少量的配置,我们就可以发送邮件,我们来 ...

  9. SpringBoot-Mail 发邮件(单发、群发、加附件、HTML格式)

    我们处理异常通常会写入日志,但我们无法及时知道.如果能够将异常信息发送到邮箱,我们可以在第一时间发现这个异常.除此以外,还可以用来给用户发验证码以及各种离线消息等等. 说明:本Demo是用Spring ...

最新文章

  1. qfile 计算文件有多少行_肉牛不喂精料行吗?如何计算肉牛一天喂多少精料?
  2. 'django_tables2' is not a registered tag library. Must be one of:
  3. android 获取元素的下标_Appium中定位方式by_android_uiautomator
  4. php字符长度函数漏洞 ctf,CTF中常见php-MD5()函数漏洞
  5. linux dma 拷贝内存数据_原来 8 张图,就可以搞懂「零拷贝」了
  6. 查看win10的产品密钥过期时间
  7. 我国使用计算机增长率表格,excel表格如何计算数据的增长率-怎么用Excel计算年均复合增长率?...
  8. 关闭ntp服务的 monitor monlist,解决漏洞CVE-2013-5211
  9. 云计算概念_云计算的概念
  10. Mysql查询获取过去一年,最后一天,每月,每月的数据
  11. android11原生录屏,终于把安卓这项功能实现了!iOS 11录屏功能演示:超好用
  12. 使用bedtools进行gwas基因注释
  13. elementUI表格分页排序
  14. 图片介绍html,HTML图片介绍
  15. 计算机系迎新晚会策划,学院迎新晚会活动方案
  16. macbook上好用的解压软件_好用的Mac解压软件推荐
  17. 怎么在安卓布局里设置滚动字体_最近很火的滚动图标!手机图标随着手势滚动,让你的桌面动起来!...
  18. Petal Maps的美学钥匙,解锁AITO问界M5的硬核浪漫
  19. 微服务链路追踪-SkyWalking
  20. (2011-05-12 旧博文搬家)BOX2D_坦克大战

热门文章

  1. 二极管反向恢复时间测试仪电脑程控测试系统智能识别示波器曲线演示分析
  2. E. Product Oriented Recurrence(codeforces R566 div2)
  3. 视屏剪辑学习笔记(3)
  4. php的视频怎么保存,premiere怎么保存剪辑好的视频
  5. php 长链接转为短链接,网站中URL长链接转换为短链接的接口
  6. 【UE】事件分发器 正确使用方法 (如何创建 Bnd Evt Delegate Signature)
  7. 关于郭德纲徒弟打人事件的一点看法
  8. plu/sql 添加运程数据库
  9. YOLOV7开源代码讲解--训练参数解释
  10. webshell及工具