没有合适的资源?快使用搜索试试~ 我知道了~
首页spring结合javamail开发文档
资源详情
资源评论
资源推荐
附录 A JavaMail 发送邮件
直接使用 JavaMail 编写邮件收发程序并不是一件轻松的事情,这归咎于 JavaMail 零散而
复杂的 API 以及各种强制需要处理的检查型异常。Spring 对使用 JavaMail 发送邮件进行了很大
程度的简化,它为 80%的需求提供了简单的处理方法,剩下的需求则可以通过直接调用 JavaMail
API 完成。
本章主要内容:
¡ JavaMail 基础知识的快速学习
¡
Spring 对发送邮件的支持
¡ 使用 Spring 邮件支持类发送各种类型的邮件
¡ 在实际应用中发送邮件的经验
本章亮点:
¡ 对 JavaMail 的基础知识进行了简明扼要的讲解
¡ 总结了实际应用中发送邮件的受用经验
A
A.1 JavaMail 快速进阶
712
A.1 JavaMail 快速进阶
在 Java 编程领域,JavaMail 是最知名的邮件解决方案。可以使用 JavaMail 在各种协议
环境下,收发各种或简单或复杂的电子邮件。但 JavaMail 本身的 API 比较难用,用户会发
现直接使用 JavaMail 发送一封简单的电子邮件并不是一件轻松的事。幸而,Spring 对
JavaMail 施展了它一贯的化繁为简的魔法,在降低使用难度的同时保留 JavaMail 本身的强
大功能。了解一下 JavaMail 的基础,有助于深刻理解 Spring 对 JavaMail 的支持。
A.1.1 JavaMail
概述
JavaMail 是由 Sun 定义的一套收发电子邮件的 API,不同的厂商可以提供自己的实现
类。但它并没有包含在 JDK 中,而是作为 Java EE 的一部分。
厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议
包括:
y
SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
y
POP3:用于接收电子邮件的标准协议;
y
IMAP:互联网消息访问协议,是 POP3 的替代协议。
这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS、POP3S 和 IMAPS。
除 JavaMail 的核心包之外,JavaMail 还需要 JAF(JavaBeans Activation Framework)
来处理不是纯文本的邮件内容。这包括 MIME(多用途互联网邮件扩展)、URL 页面和文
件附件等内容。图 A-1 描述了 JavaMail 的体系结构:
JavaMail
Java 应用程序
Java Mail API JAF
STMP
提供者
IMAP
提供者
POP3
提供者
STMP
服务器
IMAP
服务器
POP3
服务器
图 A-1 JavaMail 体系结构
y mail.jar:此 JAR 文件包含 JavaMail API 和 Sun 提供的 SMTP、IMAP 和 POP3 服务
提供程序;
y
activation.jar:此 JAR 文件包含 JAF API 和 Sun 的实现。
713
附录
A
JavaMail发送邮件
用户可以在 Spring 第三方依赖包 Spring/lib/j2ee 下找到对应的文件。
A.1.2 JavaMail
的关键对象
JavaMail 对收发邮件进行了高级抽象,形成了一些关键的接口和类,它们构成了邮件
程序的基础,下面我们分别来了解一下这些核心的对象。
Properties:属性对象
第一个我们要认识的就是属性对象 java.util.Properties,由于 JavaMail 需要和邮件服务
器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail
通过 Properties 对象封装这些属性信息。如下面的代码封装了两个属性信息:
Properties props = new Properties ();
props.put("mail.smtp.host", "smtp.sina.com.cn");
props.put("mail.smtp.auth", "true");
针对不同的邮件协议,JavaMail 规定了服务提供者必须支持一系列属性,表 A-1 是针
对 SMTP 协议的一些常见属性(属性值都以 String 类型进行设置,属性类型列仅表示属性
最终是如何被解析的):
表 A-1 JavaMail 属性
属 性 名 属性类型 说 明
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.port 等。更详细的信息请查看 com.sun.mail.smtp、com.sun.mail.pop3
和 com.sun.mail.imap 这三个包的 Javadoc:http://javamail.kenai.com/nonav/javadocs/index.html。
Session:会话对象
Session 是一个很容易被误解的类,这归咎于混淆视听的类名。乍一看,我们会以为
Session 像 HttpSession 一样代表真实的交互会话,但实际上创建 Session 对象时,并没有对
应的物理连接,它只不过是一堆配置信息的集合。Session 的主要作用包括两个方面:
1)接收各种配置属性信息:通过 Properties 对象设置的属性信息;
A.1 JavaMail 快速进阶
714
2)初始化 JavaMail 环境:根据 JavaMail 的配置文件,初始化 JavaMail 环境,以便通
过 Session 对象创建其他重要类的实例。
所以,如果把 Session 更名为 Configure 也许更容易理解一些。JavaMail 提供者在 JAR
包的 META-INF 目录下,通过以下文件提供了基本配置信息,以便 Session 能够根据这个
配置文件加载提供者的实现类:
y
javamail.providers 和 javamail.default.providers;
y
javamail.address.map 和 javamail.default.address.map。
下面是 Sun 提供者 javamail.default.providers 文件的配置信息(位于 mail.jar 包中):
# JavaMail IMAP provider Sun Microsystems, Inc
protocol=imap; type=store; class=com.sun.mail.imap.IMAPStore; vendor=Sun Microsystems, Inc;
protocol=imaps; type=store; class=com.sun.mail.imap.IMAPSSLStore; vendor=Sun
Microsystems, Inc;
# JavaMail SMTP provider Sun Microsystems, Inc
protocol=smtp; type=transport; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun
Microsystems, Inc;
protocol=smtps; type=transport; class=com.sun.mail.smtp.SMTPSSLTransport; vendor=Sun
Microsystems, Inc;
# JavaMail POP3 provider Sun Microsystems, Inc
protocol=pop3; type=store; class=com.sun.mail.pop3.POP3Store; vendor=Sun Microsystems,
Inc;
protocol=pop3s; type=store; class=com.sun.mail.pop3.POP3SSLStore; vendor=Sun
Microsystems, Inc;
这个配置文件提供了以下四个方面的信息:
y
protocol:协议名称;
y
type:邮件操作类型;
y
class:对应该操作类型的实现类;
y
vendor:厂商名称。
Session 在加载配置文件时会按照以下优先级顺序进行:
1)首先使用<JAVA_HOME>/lib 中的 javamail.providers;
2)如果 1)不存在相应的配置文件,使用类路径下 mail.jar 中 META-INF 目录下的
javamail.providers;
3)如果 2)不存在相应的配置文件,使用类路径下 mail.jar 中 META-INF 目录下的
javamail.default.providers。
所以开发者可以在<JAVA_HOME>/lib 目录下提供配置文件覆盖 mail.jar/META-INF 目
录中厂商的配置。但是,一般情况下,我们无须这样做。
Session 通过 JavaMail 配置文件以及程序中设置的 Properties 对象建构一个邮件处理环
境,后续的处理将在 Session 基础上进行。Session 拥有多个静态工厂方法用于创建 Session
实例。
y
static Session getDefaultInstance(Properties props, Authenticator authenticator):当 JVM
中已经存在默认的 Session 实例时,直接返回这个实例,否则创建一个新的 Session
实例,并将其作为 JVM 中默认 Session 实例。这个 API 方法很诡秘,我们将对它进
715
附录
A
JavaMail发送邮件
行详细的讲解。由于这个默认 Session 实例可以被同一 JVM 所有的代码访问到,而
Session 中本身又可能包含密码、用户名等敏感信息在内的所有属性信息,所以后
续调用也必须传入和第一次相同的 Authenticator 实例,否则将抛出
java.lang.SecurityException 异常。如果第一次调用时 Authenticator 入参为 null,则
后续调用通过 null 的 Authenticator 入参或直接使用 getDefaultInstance(Properties
props)即可返回这个默认的 Session 实例。值得一提的是,虽然后续调用也会传入
Properties,但新属性值并不会起作用,如果希望采用新的属性值,则可以通过
getInstance(Properties props)创建一个新的 Session 实例达到目的。Authenticator 在这
里承当了两个功能:首先,对 JVM 中默认 Session 实例进行认证保护,后续调用执
行 getDefaultInstance(Properties props, Authenticator authenticator)方法时必须和第一
次一样;其次,在具体和邮件服务器交互时,又作为认证的信息;
y
static Session getDefaultInstance(Properties props):返回 JVM 中默认的 Session 实例,
如果第一次创建 Session 未指定 Authenticator 入参,后续调用可以使用该访问获取
Session;
y
static Session getInstance(Properties props, Authenticator authenticator):创建一个新的
Session 实例,它不会在 JVM 中被作为默认实例共享;
y
static Session getInstance(Properties props):根据相关属性创建一个新的 Session 实例,
未使用安全认证信息;
Session 是 JavaMail 提供者配置文件以及设置属性信息的“容器”,Session 本身不会和
邮件服务器进行任何的通信。所以在一般情况下,我们仅需要通过 getDefaultInstance()获
取一个共享的 Session 实例就可以了,下面的代码创建了一个 Session 实例:
Properties props = System.getProperties();
props.setProperty("mail.transport.protocol", "smtp ");
…
Session session = Session.getDefaultInstance(props);①
Transport 和 Store:传输和存储
邮件的操作只有发送或接收两种处理方式,JavaMail 将这两种不同操作描述为传输
(javax.mail.Transport)和存储(javax.mail.Store)两个类,传输对应邮件的发送,而存储对
应邮件的接收(又是两个容易因命名被误解的类)。
Session 提供了几个用于创建 Transport 和 Store 实例的方法,在具体讲解这些方法之前,
我们事先了解一下 Session 创建 Transport 和 Store 的内部机制。我们知道提供者在
javamail.providers 配置文件中为每一种支持的邮件协议定义了实现类,Session 根据协议类
型(stmp、pop3 等)和邮件操作方式(传输和储存)这两个信息就可以定位到一个实例类
上。比如,指定 stmp 协议和 transport 类型后,Session 就会使用 com.sun.mail.smtp.
SMTPTransport 实现类创建一个 Transport 实例,而指定 pop3 协议和 store 类型时,则会使
用 com.sun.mail.pop3.POP3Store 实例类创建一个 Store 实例。Session 提供了多个重载的
getTransport()和 getStore()方法,这些方法将根据 Session 中 Properties 属性设置情况进行工
作,影响这两套方法工作的属性包括:
仅创建一个对象,并
不会产生任何通信
剩余26页未读,继续阅读
csbliss88
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1