-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
47 lines (29 loc) · 54.2 KB
/
atom.xml
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Sustart</title>
<subtitle> </subtitle>
<link href="https://zy68.top/atom.xml" rel="self"/>
<link href="https://zy68.top/"/>
<updated>2022-01-08T05:15:14.000Z</updated>
<id>https://zy68.top/</id>
<author>
<name>Sustart He</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>电子邮件服务及其在Spring中的应用</title>
<link href="https://zy68.top/2022/01/08/emailAndUse/"/>
<id>https://zy68.top/2022/01/08/emailAndUse/</id>
<published>2022-01-08T05:15:14.000Z</published>
<updated>2022-01-08T05:15:14.000Z</updated>
<content type="html"><![CDATA[<blockquote><p> 最近在 Spring Boot 项目中需要添加邮件功能,在完成应用开发后对邮件服务还存在些许迷雾。因此顺便回顾下<strong>电子邮件系统的工作原理</strong>以及 <strong>SMTP</strong>、<strong>MIME</strong>、<strong>POP3</strong> 和 <strong>IMAP</strong> 协议,做一次从基本原理到应用的知识点扫盲。</p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/email.jpg" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/email.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p><span id="more"></span><h2 id="一、电子邮件"><a href="#一、电子邮件" class="headerlink" title="一、电子邮件"></a>一、电子邮件</h2><div class="story post-story"><p> 邮件服务,我们常见有<strong>普通的邮件服务</strong>(即线下邮局服务)和<strong>电子邮件服务</strong>。电子邮件服务是因特网在初期就发展起来的产物,该服务能够利用网络的便捷性实现和扩展传统邮件业务,如快速发送、多用户分发和价格低廉。<strong>现代电子邮件</strong>更是具备传输包含<strong>附件、超链接、HTML格式文本</strong>和<strong>图片</strong>的功能特性。</p><p> 传统邮件服务我们都知道,下面就来认识一下电子邮件服务系统及原理。(参考《计算机网络·自顶向下方法》)</p><h3 id="1-0-电子邮件系统"><a href="#1-0-电子邮件系统" class="headerlink" title="1.0 电子邮件系统"></a>1.0 电子邮件系统</h3><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsystem.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsystem.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="emailSystem"></p><p> 一个最基本的电子邮件系统如上图所示,主要包含三个部分:<strong>用户代理</strong>、<strong>邮件服务器</strong>和 <strong>SMTP协议</strong>。用户代理为一个邮件编写发送和查看删除的客户端;邮件服务器为该系统核心,每一个邮件服务器下含开放了多个“<strong>用户邮箱</strong>”,用于存储该服务器接收到的对应的用户的邮件;SMTP协议为 <a href="https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F">TCP/IP</a> 网络中的应用层协议,能够实现<strong>单向</strong>的邮件 <strong>Push</strong> 传输功能。</p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emaillogic.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emaillogic.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="emailWorkLogic"></p><p> 如上图所示(Alice 和 Bob 为系统中任意两个用户),邮件系统的工作原理为:</p><ol><li>Alice 在其代理客户端中编写好邮件,通过 SMTP 协议发送到她的邮件服务器的<strong>外出报文队列</strong>中;</li><li>Alice 的邮件服务器根据 Alice 邮件中写入的接收方 Bob 的邮箱地址,将该邮件通过 SMTP 协议发送到 Bob 的邮件服务器。(例如:从谷歌的 Gmail邮箱服务器 发送到网易的 163邮箱服务器)</li><li>Bob 的邮件服务器接收到邮件后,根据邮件中的写入的接收方 Bob 的邮箱地址前缀(“@”的前面部分)定位到该服务器下的 Bob 的<strong>用户邮箱</strong>,并将该邮件存入该邮箱中。</li><li>Bob 可以选择直接在他的邮件服务器中查看(即如果他有该服务器的登录权限,则可以直接进入服务器查看邮件,此时不需要后面的用户代理)。也可以选择使用用户代理的方式(常见方式),在自己的用户代理中通过 <strong>POP3/IMAP/HTTP</strong> 协议从邮件服务器中 <strong>Pull</strong> 他的邮件到其代理客户端进行查看等操作。</li><li>一次邮件系统工作完成。</li></ol><p><strong>要点补充</strong></p><ul><li><strong>外出报文队列</strong>:顾名思义,为邮件服务器向其他邮件服务器发送邮件报文(即邮件内容)的队列。所有的服务器用户将邮件报文发送到队列中集中排队向外发送。如果发送失败则进行重复尝试(连接不到目的邮件服务器等问题),间隔指定时间尝试指定次数仍然失败后,邮件服务器(将会删除该邮件报文)以邮件的形式通知该用户他的邮件发送失败。</li><li><strong>邮件服务器间直连</strong>:SMTP 一般不使用中间邮件服务器发送邮件。即两个用户的邮件服务器直接进行 TCP 连接后通过 SMTP 协议进行邮件报文传输。</li></ul><h3 id="1-1-SMTP"><a href="#1-1-SMTP" class="headerlink" title="1.1 SMTP"></a>1.1 SMTP</h3><p> SMTP 是邮件系统的重要组成部分之一,是 Internet 电子邮件的核心。上面已经说明和体现了 SMTP 的大部分功能和特性,这里再介绍和总结一下 SMTP协议。</p><p> SMTP协议,即 <strong><em>Simple Mail Transfer Protocol</em> 简单邮件传输协议</strong>,是一个作用类似于 HTTP 协议的互联网协议标准(但比 HTTP 早)。SMTP协议 与 HTTP 使用报文的方式不同,SMTP 没有类似的传输严格格式化的报文格式,而是通过命令事务来完成协议的实现。</p><h4 id="1-1-1-SMTP交互模型"><a href="#1-1-1-SMTP交互模型" class="headerlink" title="1.1.1 SMTP交互模型"></a>1.1.1 SMTP交互模型</h4><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/smtpmodel.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/smtpmodel.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="smtpModel"></p><p> 如上图SMTP模型所示,为 <a href="https://datatracker.ietf.org/doc/html/rfc5321">RFC 5321 SMTP</a> 中的SMTP工作模型图。SMTP 实现为 C/S 架构,即含客户端和服务端。由客户端向服务端发送命令,服务端接收到命令后执行命令并反馈信息到客户端(即传统的C/S命令交互)。通过一次邮件事务的命令发送和执行完成邮件的发送。即SMTP交流模型:</p><p> 当用户需要发邮件时候,邮件发送者(Client-SMTP)建立一个与邮件接收者(Server-SMTP)通信的通道,发送者发送SMTP命令给接收者,接收者收到后对命令做回复响应。</p><p> 基本事务:通信通道被建立后,发送者发送 <code>MAIL</code> 命令来指定发送者的邮件,如果接受者接收这个邮件,就回复 <code>OK</code>;接着发送者发送 <code>RCPT</code>命令来指定接收者的邮箱,如果被接收同样回复<code>OK</code>,如果不接受则拒绝(不会终止整个通话)。接收者邮箱确定后,发送者用<code>DATA</code>命令指示要发送数据,并用一个<code>.</code>结束发送。如果数据被接收,会收到<code>OK</code>,然后用<code>QUIT</code>结束会话。</p><details blue><summary> 一个SMTP邮件发送例子 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">S: MAIL FROM:<Smith<span class="meta">@Alpha</span>.ARPA> # 向服务器说明邮件发送者</span><br><span class="line">R: <span class="number">250</span> OK # 服务器返回状态码和描述</span><br><span class="line">S: RCPT TO:<Jones<span class="meta">@Beta</span>.ARPA> # 向服务器说明邮件接收者</span><br><span class="line">R: <span class="number">250</span> OK</span><br><span class="line">S: RCPT TO:<Green<span class="meta">@Beta</span>.ARPA></span><br><span class="line">R: <span class="number">550</span> No such user here</span><br><span class="line">S: RCPT TO:<Brown<span class="meta">@Beta</span>.ARPA></span><br><span class="line">R: <span class="number">250</span> OK</span><br><span class="line">S: DATA # 启动邮件数据内容(ASCII编码)传输指令</span><br><span class="line">R: <span class="number">354</span> Start mail input; end with <CRLF>.<CRLF> # 服务器已经准备好接收数据并说明结束传输方式</span><br><span class="line">S: Blah blah blah...</span><br><span class="line">S: ...etc. etc. etc.</span><br><span class="line">S: <CRLF>.<CRLF> # 发送者发送数据终止语句</span><br><span class="line">R: <span class="number">250</span> OK</span><br></pre></td></tr></table></figure> </div> </details><blockquote><p>进一步的简单了解请参考 <a href="https://blog.csdn.net/sinat_36219858/article/details/71069515">SMTP协议详解</a>,官方详细了解请参考 <a href="https://datatracker.ietf.org/doc/html/rfc5321">RFC 5321 SMTP</a>。</p></blockquote><h4 id="1-1-2-邮件报文"><a href="#1-1-2-邮件报文" class="headerlink" title="1.1.2 邮件报文"></a>1.1.2 邮件报文</h4><p> SMTP协议将互联网邮件报文封装在邮件对象中。SMTP协议的邮件对象由两个部分组成:<strong>信封</strong>和<strong>内容</strong>。</p><ul><li>信封实际上是SMTP命令。</li><li>邮件报文是邮件对象中的内容,包含首部和主体两个部分。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsegment.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsegment.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="emailSegment"></p><p>RFC 文档的对报文格式的要求:</p><ol><li>所有报文都是由 ASCII 码组成;</li><li>报文由报文行组成,各行之间用回车(CR)、换行(LF)符分隔;</li><li>报文的长度不能超过 998 个字符;</li><li>报文行的长度 ≤78 个字符之内(不包括回车换行符);</li><li>报文中可包括多个首部字段和首部内容;</li><li>报文可包括一个主体,主体必须用一个空行与其首部分隔;</li><li>除非需要使用回车与换行符,否则报文中不使用回车与换行符。</li></ol><h4 id="1-1-3-SMTP-的扩展协议:MIME"><a href="#1-1-3-SMTP-的扩展协议:MIME" class="headerlink" title="1.1.3 SMTP 的扩展协议:MIME"></a>1.1.3 SMTP 的扩展协议:MIME</h4><p> 上面的邮件报文格式要求中有说到:所有的报文都是由 ASCII 码组成,那么一些非英语字符消息和二进制文件、图像、声音等非文字消息就都不能在电子邮件中传输。在互联网初期仅传输 ASCII码 还能满足需求,但到了互联网快速发展的图像视频时代就存在局限性了。因此,需要一个辅助性协议帮忙传输报文,它就是<strong>MIME</strong>。</p><p><a href="https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%94%A8%E9%80%94%E4%BA%92%E8%81%AF%E7%B6%B2%E9%83%B5%E4%BB%B6%E6%93%B4%E5%B1%95">WiKi:<strong>多用途互联网邮件扩展</strong></a>(<strong>M</strong>ultipurpose <strong>I</strong>nternet <strong>M</strong>ail <strong>E</strong>xtensions,<strong>MIME</strong>)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:</p><ul><li>非ASCII字符文本;</li><li>非文本格式附件(二进位制、声音、图片等);</li><li>由多部分(multiple parts)组成的消息体;</li><li>包含非ASCII字元的标头资讯(Header information)。</li></ul><p> MIME是通过标准化电子邮件报文的头部的附加域(fields)而实现的。这些头部的附加域,描述新的报文类型的内容和组织形式。主要的附加域有三条:</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">MIME-Version</span><span class="punctuation">: </span>1.0 # MIME版本</span><br><span class="line"><span class="attribute">Content-Type</span><span class="punctuation">: </span>text/plain; charset="ISO-8859-1" # 传递的信息类型和采用的编码</span><br><span class="line"><span class="attribute">Content-transfer-encoding</span><span class="punctuation">: </span>base64 # 编码转换方式</span><br></pre></td></tr></table></figure><details blue><summary> 一个SMTP邮件发送例子 </summary> <div class='content'> <p> 一封MIMI邮件的源码如下(借<a href="http://www.ruanyifeng.com/blog/2008/06/mime.html">阮大佬图片</a>一用):</p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsourcecode.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/emailsourcecode.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="emailSourceCode"></p> </div> </details><blockquote><p>进一步了解可参考 <a href="http://www.ruanyifeng.com/blog/2008/06/mime.html">阮一峰-MIME笔记</a> 和 <a href="https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%94%A8%E9%80%94%E4%BA%92%E8%81%AF%E7%B6%B2%E9%83%B5%E4%BB%B6%E6%93%B4%E5%B1%95">WiKi-MIME</a>。</p></blockquote><h3 id="1-2-POP3"><a href="#1-2-POP3" class="headerlink" title="1.2 POP3"></a>1.2 POP3</h3><p>如上 图2-16 所示,SMTP 实现了邮件发送到邮件服务器的 <strong>Push</strong> 传输,而 <strong>POP协议</strong> 主要用于支持客户端远程下载和管理在服务器上的电子邮件。</p><p> <a href="https://zh.wikipedia.org/wiki/%E9%83%B5%E5%B1%80%E5%8D%94%E5%AE%9A">WiKi:<strong>邮局协议</strong></a>(<strong>P</strong>ost <strong>O</strong>ffice <strong>P</strong>rotocol,<strong>POP</strong>)是TCP/IP协议族中的一员,主要用于支持使用客户端远程管理在服务器上的电子邮件。最新版本为<strong>POP3</strong>,全名“Post Office Protocol - Version 3”,而提供了 SSL 加密的 POP3协议 被称为 <strong>POP3S</strong>。</p><p> POP协议的远程管理是电子邮件客户端调连接邮件服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上。一旦邮件下载到个人终端上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”。</p><p> POP3协议 也是通过C/S架构的命令模式完成邮件管理事务:</p><ol><li>客户端先连接到邮件服务器,建立双方的 POP3 连接;</li><li>客户端发送命令执行对邮件服务器中的邮件管理。</li></ol><p>常用命令参考如下:</p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/pop3cmd.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/pop3cmd.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p><h3 id="1-3-IMAP"><a href="#1-3-IMAP" class="headerlink" title="1.3 IMAP"></a>1.3 IMAP</h3><p> <strong>因特网信息访问协议</strong>(<strong>I</strong>nternet <strong>M</strong>essage <strong>A</strong>ccess <strong>P</strong>rotocol,<strong>IMAP</strong>;以前称作<strong>交互邮件访问协议</strong>)与 POP协议一样,都是客户端对邮件服务器中邮件的管理,但 IMAP 提供了更加丰富的功能。其主要优点如下:</p><ul><li>使用IMAP4可以获得更快的响应时间。</li><li>使用IMAP4可支持多个设备,同时连接到一个邮箱。</li><li>IMAP4支持获取部分或全部 MIME 格式的电子邮件。</li><li>IMAP4支持服务器查看当前的信息状态。</li><li>IMAP4支持在服务器访问多个邮箱。</li><li>IMAP4支持在服务器端搜索电子邮件。</li><li>IMAP4支持一个定义良好的扩展机制。</li></ul><h3 id="1-4-其他应用要点"><a href="#1-4-其他应用要点" class="headerlink" title="1.4 其他应用要点"></a>1.4 其他应用要点</h3><p> 使用邮件发送,邮箱中必须开启 SMTP服务。以 QQ 为例:</p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/qqemailservice.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/qqemailservice.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p><p>相关服务器端口:</p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/qqemailserver.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/qqemailserver.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p><p>为了安全,邮件服务器都要求必须支持 SSL。<a href="https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=371">QQ 邮箱收发邮件使用说明</a>。</p></div><h2 id="二、Java中的邮件服务"><a href="#二、Java中的邮件服务" class="headerlink" title="二、Java中的邮件服务"></a>二、Java中的邮件服务</h2><div class="story post-story"><h3 id="2-1-Jakarta-Mail"><a href="#2-1-Jakarta-Mail" class="headerlink" title="2.1 Jakarta Mail"></a>2.1 Jakarta Mail</h3><p> <strong>Jakarta Mail</strong>(以前称为 JavaMail)是一个Jakarta EEAPI,用于通过SMTP、POP3和IMAP发送和接收电子邮件。Jakarta Mail 内置于<a href="https://en.wikipedia.org/wiki/Java_EE">Java EE</a>平台中,但也提供了用于<a href="https://en.wikipedia.org/wiki/Java_SE">Java SE</a>的可选包。—— WiKi 摘取。</p><p> <a href="https://en.wikipedia.org/wiki/Jakarta_Mail">WiKi百科介绍及使用Demo</a>,<a href="https://jakarta.ee/specifications/mail/2.0/jakarta-mail-spec-2.0.html">官网详细解析和应用文档</a>, <a href="https://eclipse-ee4j.github.io/mail/">Github 中开源</a>。</p><p>Maven 坐标:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.sun.mail<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jakarta.mail<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>x.x.x<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><h3 id="2-2-Spring-Boot-Mail"><a href="#2-2-Spring-Boot-Mail" class="headerlink" title="2.2 Spring Boot Mail"></a>2.2 Spring Boot Mail</h3><p> Spring Boot Mail 是基于 JavaMail 封装起来的便于使用的邮件依赖,使得用户能够避免接触底层细节,更快更方便的使用邮件服务。—— <a href="https://docs.spring.io/spring-framework/docs/5.0.13.RELEASE/spring-framework-reference/integration.html#mail">Spring官方使用介绍</a></p><p>Maven 坐标:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-mail<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><p> <strong>简单来说,Spring 封装了一个<code>JavaMailService 接口</code>及其丰富了的具体实现 <code>JavaMailServiceImpl类</code>。通过<code>JavaMailServiceImpl类</code>的<code>send()</code>方法能够执行发送邮件的功能。其中,简单邮件可以通过<code>SimpleMailMessage</code>来发送邮件,而复杂的邮件(如添加附件)可以借助<code>MimeMessageHelper</code>来构建<code>MimeMessage</code>发送邮件。</strong></p><p> 此外,Spring Boot Mail 还支持发送<strong>HTML邮件、图片、模板邮件</strong>,具体可简单<a href="https://juejin.cn/post/6844903986546343950#heading-5">参考</a>。</p><details gray><summary> 简单看一眼源码 </summary> <div class='content'> <p><strong>JavaMailService接口</strong></p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailservice.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailservice.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p><p><strong>JavaMailServiceImpl类</strong></p><p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailserviceImpl1.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailserviceImpl1.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"><br><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailserviceImpl2.png" class="lazyload" data-srcset="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/javamailserviceImpl2.png" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="email"></p> </div> </details></div><h2 id="三、Spring-Boot-中应用-Mail"><a href="#三、Spring-Boot-中应用-Mail" class="headerlink" title="三、Spring Boot 中应用 Mail"></a>三、Spring Boot 中应用 Mail</h2><div class="story post-story"><h3 id="3-1-引入和配置"><a href="#3-1-引入和配置" class="headerlink" title="3.1 引入和配置"></a>3.1 引入和配置</h3><details yellow><summary> 引入和配置 </summary> <div class='content'> <ol><li>pom 引入依赖</li></ol><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-mail<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><ol start="2"><li>application 配置文件中配置,QQ邮箱为例(<a href="https://segmentfault.com/a/1190000021587834">参考</a>+修改)</li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 字符集编码 默认 UTF-8</span></span><br><span class="line"><span class="string">spring.mail.default-encoding=UTF-8</span></span><br><span class="line"><span class="comment"># (必须)SMTP 服务器 host qq邮箱的为 smtp.qq.com 端口 465 587</span></span><br><span class="line"><span class="string">spring.mail.host=smtp.qq.com</span></span><br><span class="line"><span class="comment"># (必须)SMTP 服务器端口 不同的服务商不一样</span></span><br><span class="line"><span class="string">spring.mail.port=465</span></span><br><span class="line"><span class="comment"># SMTP 服务器使用的协议(JavaMailServiceImpl类中默认为smtp)</span></span><br><span class="line"><span class="string">spring.mail.protocol=smtp</span></span><br><span class="line"><span class="comment"># SMTP服务器需要身份验证 所以 要配置用户密码</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># (必须)发送端的用户邮箱名</span></span><br><span class="line"><span class="string">[email protected]</span></span><br><span class="line"><span class="comment"># (必须)发送端的密码(授权码) 注意保密</span></span><br><span class="line"><span class="string">spring.mail.password=oooooxxxxxxxx</span></span><br><span class="line"><span class="comment"># 指定mail会话的jndi名称 优先级较高 一般我们不使用该方式</span></span><br><span class="line"><span class="string">spring.mail.jndi-name=</span></span><br><span class="line"><span class="comment"># 这个比较重要 针对不同的SMTP服务器 都有自己的一些特色配置该属性 提供了这些配置的 key value 封装方案 例如 Gmail SMTP 服务器超时配置 spring.mail.properties.mail.smtp.timeout= 5000</span></span><br><span class="line"><span class="string">spring.mail.properties.<key></span> <span class="string">=</span></span><br><span class="line"><span class="comment"># 指定是否在启动时测试邮件服务器连接,默认为false</span></span><br><span class="line"><span class="string">spring.mail.test-connection=false</span></span><br></pre></td></tr></table></figure> </div> </details><h3 id="3-2-简单使用示例"><a href="#3-2-简单使用示例" class="headerlink" title="3.2 简单使用示例"></a>3.2 简单使用示例</h3><p> 在上述配置完成的基础上,编码如下简单使用的服务示例。<a href="https://www.jianshu.com/p/5eb000544dd7">引例参考</a></p><details blue><summary> 简单使用 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> JavaMailSenderImpl mailSender;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sendMail</span><span class="params">()</span> <span class="keyword">throws</span> MessagingException </span>{</span><br><span class="line"> <span class="comment">//简单邮件</span></span><br><span class="line"> SimpleMailMessage simpleMailMessage = <span class="keyword">new</span> SimpleMailMessage();</span><br><span class="line"> simpleMailMessage.setFrom(<span class="string">"[email protected]"</span>);</span><br><span class="line"> simpleMailMessage.setTo(<span class="string">"[email protected]"</span>);</span><br><span class="line"> simpleMailMessage.setSubject(<span class="string">"Happy New Year"</span>);</span><br><span class="line"> simpleMailMessage.setText(<span class="string">"新年快乐!"</span>);</span><br><span class="line"> <span class="comment">// true 为 HTML 邮件</span></span><br><span class="line"> <span class="comment">//messageHelper.setText(htmlStringSrc, true);</span></span><br><span class="line"> mailSender.send(simpleMailMessage);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//复杂邮件(带附件)</span></span><br><span class="line"> MimeMessage mimeMessage = mailSender.createMimeMessage();</span><br><span class="line"> MimeMessageHelper messageHelper = <span class="keyword">new</span> MimeMessageHelper(mimeMessage);</span><br><span class="line"> messageHelper.setFrom(<span class="string">"[email protected]"</span>);</span><br><span class="line"> messageHelper.setTo(<span class="string">"[email protected]"</span>);</span><br><span class="line"> messageHelper.setSubject(<span class="string">"Happy New Year"</span>);</span><br><span class="line"> messageHelper.setText(<span class="string">"新年快乐!"</span>);</span><br><span class="line"> messageHelper.addInline(<span class="string">"doge.gif"</span>, <span class="keyword">new</span> File(<span class="string">"xx/xx/doge.gif"</span>));</span><br><span class="line"> messageHelper.addAttachment(<span class="string">"work.docx"</span>, <span class="keyword">new</span> File(<span class="string">"xx/xx/work.docx"</span>));</span><br><span class="line"> mailSender.send(mimeMessage);</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><h3 id="3-3-封装使用示例"><a href="#3-3-封装使用示例" class="headerlink" title="3.3 封装使用示例"></a>3.3 封装使用示例</h3><p> 封装使用目的是为了方便业务调用,形成单独的发送邮件业务。</p><ol><li>封装一个邮件类 <code>**MailDO.java**</code></li></ol><details red><summary> 封装数据对象 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MailDO</span> </span>{</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 邮件id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String id;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发信方</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String from;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 收信方(多个邮箱用逗号“,”隔开)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String to;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 邮件主题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String subject;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 邮件内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String text;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发送时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Date sentDate;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 抄送(多个邮箱用逗号“,”隔开)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String cc;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密送(多个邮箱用逗号“,”隔开)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String bcc;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 状态</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String status;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 报错信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String error;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 附件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> File[] files;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><ol start="2"><li>编写一个服务 <code>**MailService.java**</code></li></ol><details green><summary> 邮件服务接口 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">MailService</span> </span>{</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发送邮件</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mailDO 邮件对象</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 邮件对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function">MailDO <span class="title">sendMail</span><span class="params">(MailDO mailDO)</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><ol start="3"><li>编写服务实现类 <code>**MailServiceImpl.java**</code></li></ol><details yellow><summary> 接口实现 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MailServiceImpl</span> <span class="keyword">implements</span> <span class="title">MailService</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 引入 spring-boot-mail 包中的关键邮件服务实现类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Resource</span></span><br><span class="line"> <span class="keyword">private</span> JavaMailSenderImpl mailSender;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sendMail</span><span class="params">(MailDO mailDO)</span> </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 1. 检测必须的信息是否都存在</span></span><br><span class="line"> checkMail(mailDO);</span><br><span class="line"> <span class="comment">// 2. 发送邮件</span></span><br><span class="line"> sendMimeMail(mailDO);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.error(<span class="string">"发送邮件失败:"</span>, e);</span><br><span class="line"> mailDO.setStatus(<span class="string">"failed"</span>);</span><br><span class="line"> mailDO.setError(<span class="string">"发送邮件失败:"</span> + e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检测邮件对象必须的信息是否都存在的方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mailDO 邮件对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">checkMail</span><span class="params">(MailDO mailDO)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (Objects.isNull(mailDO.getTo())) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"邮件收信人不能为空"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (Objects.isNull(mailDO.getSubject())) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"邮件主题不能为空"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (Objects.isNull(mailDO.getText())) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"邮件内容不能为空"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 具体邮件发送方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mailDO 邮件对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendMimeMail</span><span class="params">(MailDO mailDO)</span> </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 构造一个复杂邮件发送</span></span><br><span class="line"> MimeMessageHelper mimeMessageHelper = <span class="keyword">new</span> MimeMessageHelper(mailSender.createMimeMessage(), <span class="keyword">true</span>);</span><br><span class="line"> mimeMessageHelper.setFrom(mailDO.getFrom());</span><br><span class="line"> mimeMessageHelper.setTo(mailDO.getTo().split(<span class="string">","</span>));</span><br><span class="line"> mimeMessageHelper.setSubject(mailDO.getSubject());</span><br><span class="line"> mimeMessageHelper.setText(mailDO.getText());</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 抄送</span></span><br><span class="line"> <span class="keyword">if</span> (!Objects.isNull(mailDO.getCc())) {</span><br><span class="line"> mimeMessageHelper.setCc(mailDO.getCc().split(<span class="string">","</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 密送</span></span><br><span class="line"> <span class="keyword">if</span> (!Objects.isNull(mailDO.getBcc())) {</span><br><span class="line"> mimeMessageHelper.setCc(mailDO.getBcc().split(<span class="string">","</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//附件</span></span><br><span class="line"> <span class="keyword">if</span> (!Objects.isNull(mailDO.getFiles())) {</span><br><span class="line"> <span class="comment">// 多个附件</span></span><br><span class="line"> <span class="keyword">for</span> (File file : mailDO.getFiles()) {</span><br><span class="line"> mimeMessageHelper.addAttachment(Objects.requireNonNull(file.getName()), file);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 发送时间</span></span><br><span class="line"> <span class="keyword">if</span> (Objects.isNull(mailDO.getSentDate())) {</span><br><span class="line"> mailDO.setSentDate(<span class="keyword">new</span> Date());</span><br><span class="line"> }</span><br><span class="line"> mimeMessageHelper.setSentDate(mailDO.getSentDate());</span><br><span class="line"> mailSender.send(mimeMessageHelper.getMimeMessage());</span><br><span class="line"> mailDO.setStatus(<span class="string">"ok"</span>);</span><br><span class="line"> log.info(<span class="string">"发送邮件成功:{} -> {}"</span>, mailDO.getFrom(), mailDO.getTo());</span><br><span class="line"> } <span class="keyword">catch</span> (RuntimeException | MessagingException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><ol start="4"><li>测试</li></ol><details white><summary> 测试 </summary> <div class='content'> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// @Test</span></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">sendMail</span><span class="params">()</span> </span>{</span><br><span class="line"> MailDO mailDO = <span class="keyword">new</span> MailDO();</span><br><span class="line"></span><br><span class="line"> mailDO.setFrom(<span class="string">"[email protected]"</span>);</span><br><span class="line"> mailDO.setTo(<span class="string">"[email protected]"</span>);</span><br><span class="line"> mailDO.setSubject(<span class="string">"邮件业务测试"</span>);</span><br><span class="line"> mailDO.setText(<span class="string">"简单测试"</span>);</span><br><span class="line"></span><br><span class="line"> String filePath1 = <span class="string">"F:\\XXXProjects\\XXXService\\common\\common.iml"</span>;</span><br><span class="line"> String filePath2 = <span class="string">"F:\\XXXProjects\\XXXService\\common\\pom.xml"</span>;</span><br><span class="line"> File attachment1 = <span class="keyword">new</span> File(filePath1);</span><br><span class="line"> File attachment2 = <span class="keyword">new</span> File(filePath2);</span><br><span class="line"> File[] files = <span class="keyword">new</span> File[]{attachment1, attachment2};</span><br><span class="line"></span><br><span class="line"> mailDO.setFiles(files);</span><br><span class="line"> mailService.sendMail(mailDO);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure> </div> </details></div><h2 id="四、参考"><a href="#四、参考" class="headerlink" title="四、参考"></a>四、参考</h2><div class="story post-story"><ol><li><a href="SMTP%E5%8D%8F%E8%AE%AE">个人博客-SMTP协议</a></li><li><a href="https://blog.csdn.net/qq_35644234/article/details/68961603">CSDN-SMTP协议介绍</a></li><li><a href="http://www.ruanyifeng.com/blog/2008/06/mime.html">阮一峰-MIME笔记</a></li><li><a href="https://www.jianshu.com/p/5eb000544dd7">SpringBoot 发送邮件和附件(实用版)</a></li><li><a href="https://segmentfault.com/a/1190000021587834">SpringBoot 发送邮件全解析</a></li></ol></div>]]></content>
<summary type="html"><blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;最近在 Spring Boot 项目中需要添加邮件功能,在完成应用开发后对邮件服务还存在些许迷雾。因此顺便回顾下<strong>电子邮件系统的工作原理</strong>以及 <strong>SMTP</strong>、<strong>MIME</strong>、<strong>POP3</strong> 和 <strong>IMAP</strong> 协议,做一次从基本原理到应用的知识点扫盲。</p>
</blockquote>
<p><img src="https://cdn.jsdelivr.net/gh/MrGo123/asset@master/sourceinpost/spring/email.jpg" alt="email"></p></summary>
<category term="Spring" scheme="https://zy68.top/categories/Spring/"/>
<category term="SpringBoot" scheme="https://zy68.top/tags/SpringBoot/"/>
<category term="Email" scheme="https://zy68.top/tags/Email/"/>
<category term="ComputerNetworks" scheme="https://zy68.top/tags/ComputerNetworks/"/>
</entry>
</feed>