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中,如何使用,取决于我们应用程序中的实际情况。本文详细的介绍一下这三个类的主要方法。
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的方法如下:
可以看到,重构了很多,这些方法最终都会去解析上文提到的配置文件,找到对应配置信息。
这就是一封完整的邮件包含的所有信息,默认情况下是没有暗送和回复设置的,可以通过菜单栏-->查看-->暗送地址/回复地址来显示出来,回复地址默认情况下为发件人,暗送是比较猥琐的发邮件方式,暗送邮件除了被暗送者,没有人能知道暗送给谁了,邮件头信息中也不会记录。下面来看下Message中设置邮件信息的一些方法。
现在大多数SMTP服务器要求发件人与连接账户必须一致,否则会抛出验证失败的异常,这样是防止用户伪装成其它人的账户恶意发送邮件。
第一个方法设置单个人,第二个方法设置多个人。方法中第一个参数涉及到另一个类RecipientType,该类是Message的静态内部类,期内有三个常量值:
TO - 收件人;CC - 抄送人;BCC - 暗送人。
设置收件人收到邮件后的回复地址。
设置邮件标题/主题。
设置邮件文本内容、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,转载请注明。
目录(?)[+]
本文来自:高爽|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. |
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. |
收件人/抄送人/暗送人
void | setRecipient(Message.RecipientType type,Address address) Set the recipient address. |
abstractvoid | setRecipients(Message.RecipientType type,Address[] addresses) Set the recipient addresses. |
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. |
回复人
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". |
示例
下面来看一个稍复杂点的示例:[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,转载请注明。
相关文章推荐
- 【Java】spring-MVC 使用中莫名的400解决方法
- myeclipse使用前的基本配置
- springmvc学习笔记--Interceptor机制和实践
- eclipse快捷键(转)
- 使用eclipse 创建一个简单的java项目(helloWorld)
- springMVC两种方式实现多文件上传及效率比较
- JDK5个小工具
- java读取.properties文件
- 庆丰包子铺自助点餐系统
- java int与integer的区别
- Java魔法堂:注解用法详解——@SuppressWarnings(转)
- Java中对文件的解压缩
- java基础之枚举用法
- 在多核操作系统中,java多线程不能被指定到具体cpu上,而是由操作系统自动分配
- eclipse svn subclipse下载地址
- 新手之服务端创建服务以及客户端的实现
- java中的Actor模式 Akka实例
- 64位Ubuntu,Eclipse新建Android project后缺失R文件的原因分析及解决办法
- Java猜拳小游戏
- spring 事务传播问题