JAVAMAIL核心类介绍
JAVAMAIL(所需类包: mail.jar activation.jar)
JavaMail API 核心类包括:Session,Address,Message,Authenticator,Transpor,Store,Folder.
1.javax.mail.Session
Session类定义了与远程邮件系统通信的邮件会话(MailSession).JavaMail会话仅仅用于存储与服务器建立连接会话相关的逻辑Session类是JavaMail API最高层入口类。Session对象管理配置选项行和用于与邮件系统交互的用户认证信息,它使用Java.util.Properties对象配置邮件会话的属性,如邮件服务器,用户名,密码及整个应用程序中共享的其它信息。(Session本身并不处理任何授权操作,他只是存储这些授权的信息)
Session类的构造器是私有的,他不能被继承。他有两个静态方法:getInstance 和getDefaultInstance来获取Session实例,前者创建的不能被其它JVM共享的会话实例,后者创建的可以被其它JVM共享的会话实例。
Session实例使用的属性
mail.transport.protocol 邮件传输的协议,getProtocol()方法时返回默认传入协议
mail.smtp.host 使用的默认主机
mail.smtp.port 主机使用的端口 25
mail.user 未指定用户时,传输和存储使用的默认用户 User.name
mail.from 发送者的邮件地址
mail.store.protocol 存储协议,getStore()方法返回默认的存储协议
mail.protocol.host 替代指定协议的mail.host
mail.protocol.user 替代指定协议的mail.user
mail.debug 用于调试会话
mail.smtp.auth true/false 邮件服务器是否要验证
Properties props
=
new
Properties();
//
设置邮件会话的属性
props.put(
"
mail.transport.protocol
"
,
"
smtp
"
);
props.put(
"
mail.smtp.host
"
,
"
smtp.usish.com
"
);
props.put(
"
mail.smtp.port
"
,
"
25
"
);
props.put("mail.smtp.auth","true");
//
获得邮件会话对象
mailSession
=
Session.getDefaultInstance(props);
//
不使用认证
mailSession
=
Session.getDefaultInstance(props,authenticator);
//
使用认证
3.javax.mail.Address
Address类表示电子邮件地址,它是一个抽象类,当要表示多个地址时可以用逗号隔开。
最经常使用的子类是:javax.mail.internet.InternetAddress提供具体实现,且通常可串行化。如果创建地址只包含电子邮件地址,只要传递电子邮件地址到构造器即可。
//
带其它信息的地址
InternetAddress addr
=
new
InternetAddress();
addr.setAddress(
"
derek_g@usish.com
"
);
addr.setPersonal(
"
derek Guo
"
);
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
//
带多MAIL地址
Address[] addrs
=
InternetAddress.parse(
"
derek_g@usish.com,envoydada@126.com
"
);
4.javax.mail.Message
获得Session对象后,可以继续创建要发送的邮件消息,这由Message类来完成。Message实现了Part接口,它表示一个邮件消息,包含一系列属性和一个消息的内容。Message是抽象类,实际使用时必须用一个子类代替以表示集体的邮件格式。如子类javax.mail.internet.MimeMessage , 实现了RFC822和MIME标准。Message子类通常通过字节流构建其实现。
创建Message的两个构造方法:
Message message
=
new
MimeMessage(Session session);
MimeMessage message
=
new
MimeMessage(MimeMessage message);
获得message之后,可以设置消息的各个部分
5.javax.mail.Transport
消息发送Transport类。该类使用指定协议发送消息(通常是SMTP)。Transport是抽象类(继承自Service类)提供很多通用方法,如命名传输、连接服务器和监听传输事件等。
Transport.send(message); 发送邮件。
还可以进一步控制消息发送:
6.javax.mail.Store
Store是一个抽象类,它模拟了消息存储器及其内部目录(Folder)访问协议,以存储和读取消息,其子类提供具体实现。
Store定义的存储器包括一个分层的目录体系,消息存储在目录内,。客户程序可以通过获取一个实现了数据库访问协议的Store对象来访问消息存储器,绝大多数存储器要求用户在访问前提供认证信息,connect方法执行了该认证过程。
7.javax.mail.Folder
Folder是一个抽象类,用于分级组织邮件,其子类提供针对具体协议的实现。
Folder代表的目录可以容纳消息或子目录,存储在目录内的消息被顺序计数(从1开始到消息总数),该顺序被称为“邮箱顺序”,通常基于邮件消息到达目录的顺序。邮件顺序的变动将改变消息的序列号,这种情况仅发生在客户程序调用Expunge方法擦除目录内设置了Flags.Flag.DELETED标志位的消息时。执行擦除操作后,目录内消息将重新编号。
客户程序可以通过消息序列号或直接通过相应的Message对象应用目录中的消息,由于消息序列号在会话中很可能改变,因此应尽可能保存Message对象而非序列号来反复引用对象。
连接到Store之后,接下来可以获取一个文件夹(Folder)。该文件夹必须先使用open()方法打开,然后才能读取里面的消息:
获得Message之后,就可以用getContent()获得其内容,或者用writeTo()将内容写入输出流。getContent()方法之能得到消息内容,而writeTo()的输出却包含消息头.
读完邮件之后要关闭与Folder和Store的连接:
JAVAMAIL(所需类包: mail.jar activation.jar)
JavaMail API 核心类包括:Session,Address,Message,Authenticator,Transpor,Store,Folder.
1.javax.mail.Session
Session类定义了与远程邮件系统通信的邮件会话(MailSession).JavaMail会话仅仅用于存储与服务器建立连接会话相关的逻辑Session类是JavaMail API最高层入口类。Session对象管理配置选项行和用于与邮件系统交互的用户认证信息,它使用Java.util.Properties对象配置邮件会话的属性,如邮件服务器,用户名,密码及整个应用程序中共享的其它信息。(Session本身并不处理任何授权操作,他只是存储这些授权的信息)
Session类的构造器是私有的,他不能被继承。他有两个静态方法:getInstance 和getDefaultInstance来获取Session实例,前者创建的不能被其它JVM共享的会话实例,后者创建的可以被其它JVM共享的会话实例。
Session实例使用的属性
mail.transport.protocol 邮件传输的协议,getProtocol()方法时返回默认传入协议
mail.smtp.host 使用的默认主机
mail.smtp.port 主机使用的端口 25
mail.user 未指定用户时,传输和存储使用的默认用户 User.name
mail.from 发送者的邮件地址
mail.store.protocol 存储协议,getStore()方法返回默认的存储协议
mail.protocol.host 替代指定协议的mail.host
mail.protocol.user 替代指定协议的mail.user
mail.debug 用于调试会话
mail.smtp.auth true/false 邮件服务器是否要验证
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
props.put("mail.smtp.auth","true");
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
2.javax.mail.Authenticator
Session.getDefaultInstance(props,authenticator) 创建会话时使用Authenticator对象以进行认证,如果传入null对象,那么和不使用认证的调用方式一致。
Authenticator代表一个可以为网络连接获取认证信息的对象,它通常通过提示用户输入用户名和密码来收集认证信息,使连接可以访问受保护的资源。首先创建Authenticator的一个子类,并且在会话对象创建时为会话注册该Authenticator对象。
public
class
PopupAuthenticator
extends
Authenticator{
String username = null ;
String password = null ;
public PopupAuthenticator(){}
public PopupAuthenticator(String name,String pwd){
username = name;
password = pwd;
getPasswordAuthentication();
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
String username = null ;
String password = null ;
public PopupAuthenticator(){}
public PopupAuthenticator(String name,String pwd){
username = name;
password = pwd;
getPasswordAuthentication();
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
使用这个验证类
PopupAuthenticator authenticator
=
new
PopupAuthenticator(
"
envoydada
"
,
"
dada
"
);
mailSession = Session.getDefaultInstance(props,authenticator); // 使用认证
mailSession = Session.getDefaultInstance(props,authenticator); // 使用认证
3.javax.mail.Address
Address类表示电子邮件地址,它是一个抽象类,当要表示多个地址时可以用逗号隔开。
最经常使用的子类是:javax.mail.internet.InternetAddress提供具体实现,且通常可串行化。如果创建地址只包含电子邮件地址,只要传递电子邮件地址到构造器即可。
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
4.javax.mail.Message
获得Session对象后,可以继续创建要发送的邮件消息,这由Message类来完成。Message实现了Part接口,它表示一个邮件消息,包含一系列属性和一个消息的内容。Message是抽象类,实际使用时必须用一个子类代替以表示集体的邮件格式。如子类javax.mail.internet.MimeMessage , 实现了RFC822和MIME标准。Message子类通常通过字节流构建其实现。
创建Message的两个构造方法:
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/4f1150b881333f12a311ae9ef34da474.gif)
获得message之后,可以设置消息的各个部分
msg.setFrom(
new
InternetAddress(from));
//
设置发件人
msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to)); // 设置收件人
msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc)); // 设置抄送人
msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc)); // 设置暗送人
msg.setSentDate(d); // 设置发邮件的签名时间
msg.setSubject(subject); // 设置邮件主题
// msg.setText(content); // 纯文本发送text/plain表示纯文本,默认
msg.setContent( " <meta http-equiv=Content-Type content=text/html; charset=utf-8>邮件测试内容" , " text/html;charset=utf-8 " ); // html格式发送
msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to)); // 设置收件人
msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc)); // 设置抄送人
msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc)); // 设置暗送人
msg.setSentDate(d); // 设置发邮件的签名时间
msg.setSubject(subject); // 设置邮件主题
// msg.setText(content); // 纯文本发送text/plain表示纯文本,默认
msg.setContent( " <meta http-equiv=Content-Type content=text/html; charset=utf-8>邮件测试内容" , " text/html;charset=utf-8 " ); // html格式发送
5.javax.mail.Transport
消息发送Transport类。该类使用指定协议发送消息(通常是SMTP)。Transport是抽象类(继承自Service类)提供很多通用方法,如命名传输、连接服务器和监听传输事件等。
Transport.send(message); 发送邮件。
还可以进一步控制消息发送:
Transport transport
=
session.getTransport(
"
smtp
"
);
transport.connect( (String) props.get( " mail.smtp.host " ), username,password);
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
transport.close();
transport.connect( (String) props.get( " mail.smtp.host " ), username,password);
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
transport.close();
6.javax.mail.Store
Store是一个抽象类,它模拟了消息存储器及其内部目录(Folder)访问协议,以存储和读取消息,其子类提供具体实现。
Store定义的存储器包括一个分层的目录体系,消息存储在目录内,。客户程序可以通过获取一个实现了数据库访问协议的Store对象来访问消息存储器,绝大多数存储器要求用户在访问前提供认证信息,connect方法执行了该认证过程。
Store store
=
session.getStore(
"
pop3
"
);
//
指定协议
store.connect(host,usename,password); //
store.connect(host,usename,password); //
7.javax.mail.Folder
Folder是一个抽象类,用于分级组织邮件,其子类提供针对具体协议的实现。
Folder代表的目录可以容纳消息或子目录,存储在目录内的消息被顺序计数(从1开始到消息总数),该顺序被称为“邮箱顺序”,通常基于邮件消息到达目录的顺序。邮件顺序的变动将改变消息的序列号,这种情况仅发生在客户程序调用Expunge方法擦除目录内设置了Flags.Flag.DELETED标志位的消息时。执行擦除操作后,目录内消息将重新编号。
客户程序可以通过消息序列号或直接通过相应的Message对象应用目录中的消息,由于消息序列号在会话中很可能改变,因此应尽可能保存Message对象而非序列号来反复引用对象。
连接到Store之后,接下来可以获取一个文件夹(Folder)。该文件夹必须先使用open()方法打开,然后才能读取里面的消息:
Folder folder
=
store.getDefaultFolder();
// 或 : Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_WRITE);
Message message[] = folder.getMessage();
open()方法指定了要打开的文件夹及打开方式(如Folder.READ_WRITE)。 inbox是POP3唯一可以使用的文件夹。如果使用IMAP,还可以用其它的文件夹。
// 或 : Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_WRITE);
Message message[] = folder.getMessage();
获得Message之后,就可以用getContent()获得其内容,或者用writeTo()将内容写入输出流。getContent()方法之能得到消息内容,而writeTo()的输出却包含消息头.
读完邮件之后要关闭与Folder和Store的连接:
folder.close(aBoolean);
store.close();
store.close();