A.1 JavaMail 快速进阶
716
属 性 名 说 明
mail.transport.protocol 默认的传输邮件协议,例如:stmp。
mail.store.protocol 默认的存储邮件协议,例如:pop3。
mail.host 默认的邮件服务器地址,例如:192.168.67.1。
mail.user 默认的登录用户名,例如:masterspring。
下面,我们再回过头来了解 Session 的 getTransport()和 getStore()的重载方法。
y
Transport getTransport():当 Session 实例设置了 mail.transport.protocol 属性时,该方
法返回对应的 Transport 实例,否则抛出 javax.mail.NoSuchProviderException。
y
Transport getTransport(String protocol):如果 Session 没有设置 mail.transport.protocol
属性,可以通过该方法返回指定类型的 Transport,如:transport = session.getTransport
("smtp")。
如果 Session 中未包含 Authenticator,以上两方法创建的 Transport 实例和邮件服务器
交互时必须显式提供的用户名/密码的认证信息。如果 Authenticator 非空,则可以在和邮件
服务器交互时被作为认证信息使用。除了以上两种提供认证信息的方式外,Session 还可以
使用以下的方法为 Transport 提供认证信息。
y
Transport getTransport(URLName url):用户可以通过 URLName 入参指定邮件协议、
邮件服务器、端口、用户名和密码信息,请看下面的代码:
URLName urln = new URLName("smtp"," smtp.sina.com.cn",25,null,"masterspring", "spring");
Transport transport = session.getTransport(urln);
这里,指定了邮件协议为 smtp,邮件服务器是 smtp.sina.com.cn,端口为 25,用户名/
密码为 masterspring/spring。
getStore()也有和 getTransport()相似的重载方法:
y
Store getStore();
y
Store getStore(String protocol);
y
Store getStore(URLName url)。
在从 Session 中获取 Transport 和 Store 时,也没有和邮件服务器发生任何通信,仅仅
是创建一个内存实例而已,因此即使用户名和密码是错误的,也不会抛出运行异常。
Transport 和 Store 都拥有 connect()和 close()方法,只有调用 connect()方法时,程序才
会和邮件服务器产生物理连接。服务器地址、端口以及用户名/密码等信息在此时才会真正
被使用。
如果用户没有在构建 Session 或 Transport/Store 时提供认证信息,JavaMail 允许用户在
调用 connect()方法时再提供连接信息:connect(String host, int port, String user, String
password)。如果我们回顾一下 JDBC 的 API,就会发现 JavaMail 设置连接的认证信息确实
是比较灵活的,存在三种方式:1)在创建 Session 时通过 Authenticator 设置;2)在创建
Transport/Store 时通过 URLName 提供;3)在实际连接时通过 connect()方法入参提供。但是
这种过度的灵活性反而增强了理解的难度,造成使用上的不便。
Message:消息对象
javax.mail.Message 代表邮件信息,包含一系列的属性,其中 content 属性表示邮件的