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 邮件服务器是否要验证
// 设置邮件会话的属性
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); // 使用认证
2.javax.mail.Authenticator
Session.getDefaultInstance(props,authenticator) 创建会话时使用Authenticator对象以进行认证,如果传入null对象,那么和不使用认证的调用方式一致。
Authenticator代表一个可以为网络连接获取认证信息的对象,它通常通过提示用户输入用户名和密码来收集认证信息,使连接可以访问受保护的资源。首先创建Authenticator的一个子类,并且在会话对象创建时为会话注册该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);
}
}
使用这个验证类
mailSession = Session.getDefaultInstance(props,authenticator); // 使用认证
3.javax.mail.Address
Address类表示电子邮件地址,它是一个抽象类,当要表示多个地址时可以用逗号隔开。
最经常使用的子类是:javax.mail.internet.InternetAddress提供具体实现,且通常可串行化。如果创建地址只包含电子邮件地址,只要传递电子邮件地址到构造器即可。
InternetAddress addr = new InternetAddress();
addr.setAddress( " [email protected] " );
addr.setPersonal( " derek Guo " );
// 带多MAIL地址
Address[] addrs = InternetAddress.parse( " [email protected],[email protected] " );
4.javax.mail.Message
获得Session对象后,可以继续创建要发送的邮件消息,这由Message类来完成。Message实现了Part接口,它表示一个邮件消息,包含一系列属性和一个消息的内容。Message是抽象类,实际使用时必须用一个子类代替以表示集体的邮件格式。如子类javax.mail.internet.MimeMessage , 实现了RFC822和MIME标准。Message子类通常通过字节流构建其实现。
创建Message的两个构造方法:
MimeMessage message = new MimeMessage(MimeMessage message);
获得message之后,可以设置消息的各个部分
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.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.connect(host,usename,password); //
7.javax.mail.Folder
Folder是一个抽象类,用于分级组织邮件,其子类提供针对具体协议的实现。
Folder代表的目录可以容纳消息或子目录,存储在目录内的消息被顺序计数(从1开始到消息总数),该顺序被称为“邮箱顺序”,通常基于邮件消息到达目录的顺序。邮件顺序的变动将改变消息的序列号,这种情况仅发生在客户程序调用Expunge方法擦除目录内设置了Flags.Flag.DELETED标志位的消息时。执行擦除操作后,目录内消息将重新编号。
客户程序可以通过消息序列号或直接通过相应的Message对象应用目录中的消息,由于消息序列号在会话中很可能改变,因此应尽可能保存Message对象而非序列号来反复引用对象。
连接到Store之后,接下来可以获取一个文件夹(Folder)。该文件夹必须先使用open()方法打开,然后才能读取里面的消息:
// 或 : Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_WRITE);
Message message[] = folder.getMessage();
获得Message之后,就可以用getContent()获得其内容,或者用writeTo()将内容写入输出流。getContent()方法之能得到消息内容,而writeTo()的输出却包含消息头.
读完邮件之后要关闭与Folder和Store的连接:
store.close();