Spring 邮件发送出现bug,出现Bug以及解决方案[乐字节]

详细Spring如何进行邮件发送

本文由乐字节Java架构课程独家赞助播出

Spring 邮件发送

主要内容

Spring邮件发送.png

JavaMail 概述

​ JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。JavaMail 是由 Sun 定义的一套收发电子邮件的 API,它能够方便地执行一些经常使用的邮件传输,不一样的厂商能够提供本身的实现类。但它并无包含在 JDK 中,而是做为 JavaEE 的一部分。java

​ 厂商所提供的 JavaMail 服务程序能够有选择地实现某些邮件协议,常见的邮件协议包括:编程

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
  • POP3:用于接收电子邮件的标准协议;
  • IMAP:互联网消息协议,是 POP3 的替代协议。

​ 这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS,POP3S 和 IMAPS。除 JavaMail 服务提供程序以外, JavaMail 还须要 JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括 MIME(多用途互联网邮件扩展)、URL 页面和文件附件等内容。另外,JavaMail 依赖 JAF(JavaBeans Activation Framework),JAF 在 Java6 以后已经合并到 JDK 中,而 JDK5 以前须要另外下载 JAF 的类库。api

协议介绍

​ 在研究 JavaMail API 的细则以前,首先须要对于 API 用到的协议有个认识。对于 java mail 来讲用到的协议有常见的几种: SMTP、POP、IMAP、MIME安全

SMTP

​ 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定义。它定义了发送电子邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service
Provider's,ISP's)SMTP 服务器通讯。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 得到。服务器

POP

​ POP 表明邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939 定义了这个协议。POP 是一种机制,因特网上大多数人用它获得邮件。它规定每一个用户一个邮箱的支持。这就是它所能作的,而这也形成了许多混淆。使用 POP3 时,用户熟悉的许多性能并非由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的邮件,还能计算出有多少是新的。因此当使用 JavaMail API 时,若是您想要这类信息,您就必须本身算。session

IMAP

​ IMAP 是更高级的用于接收消息的协议。在 RFC 2060 中被定义,IMAP 表明因特网消息访问协议(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并期望它支持 IMAP 全部性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序能够利用这种状况 — 用户在服务器上有多个文件夹(folder),而且这些文件夹能够被多个用户共享。由于有这一更高级的性能,您也许会认为全部用户都会使用 IMAP。事实并非这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每一个用户的多个文件夹中维护消息。这样虽然能将消息集中备份,但随着用户长期的邮件夹愈来愈大,到磁盘空间耗尽时,每一个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。架构

MIME

​ MIME 表明多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。这里有不少不一样的有效文档:RFC 82二、RFC 204五、RFC
2046 和 RFC 2047。做为一个 JavaMail API 的用户,您一般没必要对这些格式操心。不管如何,必定存在这些格式并且程序会用到它。socket

JavaMail 的关键对象

​ JavaMail 对收发邮件进行了高级的抽象,造成了一些关键的的接口和类,它们构成了程序的基础,下面咱们分别来了解一下这些最多见的对象。ide

Properties 属性对象

​ 因为 JavaMail 须要和邮件服务器进行通讯,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail 经过 Properties 对象封装这些属性信息。以下面的代码封装了两个属性信息:性能

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.sina.com.cn");
props.put("mail.smtp.auth", "true");

​ 针对不一样的的邮件协议,JavaMail 规定了服务提供者必须支持一系列属性,下表是针对 SMTP 协议的一些常见属性(属性值都以 String 类型进行设置,属性类型栏仅表示属性是如何被解析的):

属性名 类型 说明
mail.smtp.host String SMTP 服务器地址,如smtp.sina.com.cn
mail.smtp.port int SMTP 服务器端口号,默认为 25
mail.smtp.auth boolean SMTP 服务器是否须要用户认证,默认为 false
mail.smtp.user String SMTP 默认的登录用户名
mail.smtp.from String 默认的邮件发送源地址
mail.smtp.socketFactory.class String socket 工厂类类名
经过设置该属性能够覆盖提供者默认的实现,必须实现javax.NET.SocketFactory接口
mail.smtp.socketFactory.port int 指定 socket 工厂类所用的端口号
若是没有规定,则使用默认的端口号
mail.smtp.socketFactory.fallback boolean 设置为 true 时,当使用指定的socket 类建立 socket 失败后,将使用 Java.net.Socket 建立socket,默认为 true
mail.smtp.timeout int I/O 链接超时时间,单位为毫秒,默认为永不超时

​ 其余几个协议也有相似的一系列属性,如 POP3 的 mail.pop3.host、mail.pop3.port 以及IMAP 的 mail.imap.host、mail.imap.host 等。

Session 会话对象

​ Session 是一个很容易被误解的类,这归咎于混淆视听的类名。千万不要觉得这里的 Session 像 HttpSession 同样表明真实的交互会话,但建立 Session 对象时,并无对应的物理链接,它只不过是一对配置信息的集合。

​ Session 的主要做用,包括两个方面:

  1. 接收各类配置属性信息:经过 Properties 对象设置的属性信息;
  2. 初始化 JavaMail 环境:根据 JavaMail 的配置文件,初始化 JavaMail 环境,以便经过 Session 对象建立其余重要类的实例。

Transport 和 Store 传输和存储

​ 邮件操做只有发送或接收两种处理方式,JavaMail 将这两种不一样操做描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。

Message 消息对象

​ 一旦得到 Session 对象,就能够继续建立要发送的消息。这由 Message 类来完成。由于 Message 是个抽象类,您必需用一个子类,多数状况下为 javax.mail.internet.MimeMessage。MimeMessage 是个能理解 MIME 类型和头的电子邮件消息,正如不一样 RFC 中所定义的。虽然在某些头部域非 ASCII 字符也能被译码,但 Message 头只能被限制为用 US-ASCII 字符。

Address 地址

​ 一旦您建立了 Session 和 Message,并将内容填入消息后,就能够用 Address 肯定信件地址了。和 Message 同样,Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。若建立的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就好了。

Authenticator 认证者

​ 与 java 类同样,JavaMail API 也能够利用 Authenticator 经过用户名和密码访问受保护的资源。对于 JavaMail API 来讲,这些资源就是邮件服务器。JavaMail Authenticator 在 javax.mail 包中,并且它和 java.net 中同名的类 Authenticator 不一样。二者并不共享同一个 Authenticator,由于 JavaMail API 用于 Java 1.1,它没有 java.net 类别。要使用 Authenticator,先建立一个抽象类的子类,并从 getPasswordAuthentication() 方法中返回 PasswordAuthentication 实例。建立完成后,您必需向 session 注册 Authenticator。而后,在须要认证的时候,就会通知 Authenticator。您能够弹出窗口,也能够从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们做为 PasswordAuthentication 对象返回给调用程序。

Java Mail 环境准备

设置邮箱服务

这里是以163邮箱为例

![]()

注册 163 邮箱,登陆 163 邮箱后,设置邮箱帐户开通 smtp 服务

![]()

![]()

​ 须要根据注册时的手机号发送的验证码来开通获取邮箱客户端受权码。开通成功后,会显示我的受权访问码,该受权码是后面经过 Java mail 发送邮件的认证密码,很是重要。

添加依赖

建立 Maven 项目,在 pom.xml 配置文件中添加 mail 的所需的依赖

<!-- Java Mail -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

ependency>

<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>

</dependency>

### 后续待更新
相关文章
相关标签/搜索