您的位置:首页 > 编程语言 > Java开发

Java Mail(三):Session、Message详解

2015-12-25 15:46 555 查看
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau。

目录(?)[+]

本文来自:高爽|Coder,原文地址:/article/1421624.html,转载请注明。

上篇文章介绍了JavaMail并实现了一个发送邮件的简单示例,JavaMail API使用上非常灵活,比如,服务器信息可以设置到Session中,也可以设置到Transport中,收件人可以设置到Message中,也可以设置到Transport中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。

Session

Session用于收集JavaMail运行过程中的环境信息,它可以创建一个单例的对象,也可以每次创建新的对象,Session没有构造器,只能通过如下方法创造实例:
static Session
getDefaultInstance(Properties props)


Get the default Session object.
static Session
getDefaultInstance(Properties props,Authenticator authenticator)


Get the default Session object.
static Session
getInstance(Properties props)


Get a new Session object.
static Session
getInstance(Properties props,Authenticator authenticator)


Get a new Session object.
getDefaultInstance得到的始终是该方法初次创建的缺省的对象,而getInstance得到的始终是新的对象,Authenticator的使用后面会说到。通过Session可以创建Transport(用于发送邮件)和Store(用于接收邮件),Transport和Store是JavaMail API中定义好的接口,通过上文我们知道JavaMail分为API和service provider两部分,API定义了相关接口(eg.:Transport andStore),service
provider中实现了这些接口,这些实现类配置在名为javamail.providers或javamail.default.providers的文件中,该文件放在mail.jar/smtp.jar/pop3.jar/imap.jar中的META-INF下,文件内容格式如:

[plain]
view plaincopyprint?





# 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;

每一行声明了协议名称、类型、实现类、供应商、版本等信息,如果需要自己实现相应的协议,必须按照该格式配置好,Java Mail API中才能正确的调用到。Session中提供的创建Trasnsport和Store的方法如下:
Store
getStore()


Get aStore object that implements this user's desiredStore protocol.
Store
getStore(Provider provider)


Get an instance of the store specified by Provider.
Store
getStore(String protocol)


Get aStore object that implements the specified protocol.
Store
getStore(URLName url)


Get aStore object for the given URLName.
Transport
getTransport()


Get aTransport object that implements this user's desiredTransport protcol.
Transport
getTransport(Address address)


Get aTransport object that can transport a Message of the specified address type.
Transport
getTransport(Provider provider)


Get an instance of the transport specified in the Provider.
Transport
getTransport(String protocol)


Get aTransport object that implements the specified protocol.
Transport
getTransport(URLName url)


Get aTransport object for the given URLName.
可以看到,重构了很多,这些方法最终都会去解析上文提到的配置文件,找到对应配置信息。

Message

Message是邮件的载体,用于封装邮件的所有信息,Message是一个抽象类,已知的实现类有MimeMessage。一封完整的邮件都有哪些信息呢?我们打开一个邮件客户端,我用的是FoxMail,新建一封邮件,如下图所示:


这就是一封完整的邮件包含的所有信息,默认情况下是没有暗送和回复设置的,可以通过菜单栏-->查看-->暗送地址/回复地址来显示出来,回复地址默认情况下为发件人,暗送是比较猥琐的发邮件方式,暗送邮件除了被暗送者,没有人能知道暗送给谁了,邮件头信息中也不会记录。下面来看下Message中设置邮件信息的一些方法。

发件人

abstractvoid
setFrom()


Set the "From" attribute in this Message.
abstractvoid
setFrom(Address address)


Set the "From" attribute in this Message.
现在大多数SMTP服务器要求发件人与连接账户必须一致,否则会抛出验证失败的异常,这样是防止用户伪装成其它人的账户恶意发送邮件。

收件人/抄送人/暗送人

void
setRecipient(Message.RecipientType type,Address address)


Set the recipient address.
abstractvoid
setRecipients(Message.RecipientType type,Address[] addresses)


Set the recipient addresses.
第一个方法设置单个人,第二个方法设置多个人。方法中第一个参数涉及到另一个类RecipientType,该类是Message的静态内部类,期内有三个常量值:
static Message.RecipientType
BCC


The "Bcc" (blind carbon copy) recipients.
static Message.RecipientType
CC


The "Cc" (carbon copy) recipients.
static Message.RecipientType
TO


The "To" (primary) recipients.
TO - 收件人;CC - 抄送人;BCC - 暗送人。

回复人

void
setReplyTo(Address[] addresses)


Set the addresses to which replies should be directed.
设置收件人收到邮件后的回复地址。

标题

abstractvoid
setSubject(String subject)


Set the subject of this message.
设置邮件标题/主题。

内容

void
setContent(Multipart mp)


This method sets the given Multipart object as this message's content.
void
setContent(Object obj,String type)


A convenience method for setting this part's content.
void
setText(String text)


A convenience method that sets the given String as this part's content with a MIME type of "text/plain".
设置邮件文本内容、HTML内容、附件内容。

示例

下面来看一个稍复杂点的示例:

[java]
view plaincopyprint?





public class JavaMailTest2 {

public staticvoid main(String[] args) throws MessagingException {
Properties props = new Properties();
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.163.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");

// 设置环境信息
Session session = Session.getInstance(props, new Authenticator() {
// 在session中设置账户信息,Transport发送邮件时会使用
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("java_mail_001", "javamail");
}
});

// 创建邮件对象
Message msg = new MimeMessage(session);
// 发件人
msg.setFrom(new InternetAddress("java_mail_001@163.com"));
// 多个收件人
msg.setRecipients(RecipientType.TO, InternetAddress.parse("java_mail_002@163.com,java_mail_003@163.com"));
// 抄送人
msg.setRecipient(RecipientType.CC, new InternetAddress("java_mail_001@163.com"));
// 暗送人
msg.setRecipient(RecipientType.BCC, new InternetAddress("java_mail_004@163.com"));

// 主题
msg.setSubject("中文主题");
// HTML内容
msg.setContent("<div align=\"center\">你好啊</div>", "text/html;charset=utf-8");

// 连接邮件服务器、发送邮件、关闭连接,全干了
Transport.send(msg);
}

}

本文来自:高爽|Coder,原文地址:/article/1421624.html,转载请注明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: