java mail api提供了一个独自的平台和协议去构建你的电子邮件应用。java mail api 提供了一系列的抽象类定义了一个构成邮件系统的对象,api 中定义的类如Message,Store,Transport,你可以继承这些类来实现你所需要的功能和协议。
除此之外,api提供了一套具体的实例化的类,这些实例化的类包括:MimeMessage,MimeBodyPart等,他们实现了广泛使用的internet电子邮件协议,而且符合RFC822和RFC2045规范。
下载java mail
JavaMail API 1.4.3 Release :http://www.oracle.com/technetwork/java/index-jsp-139225.html
JavaBeans Activation Framework 1.1(JAF): http://www.oracle.com/technetwork/java/jaf11-139815.html
如果你使用了J2EE 1.4 Libraries 就不用再下载这两个jar包了,因为它里面有这两两个包。
名词解释
JAF:JavaBeans Activation Framework的缩写,JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。activation.jar 文件就是JAF的框架jar包。
smtp:简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
POP3:邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件
MIME:MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
主要的java mail api 组件
Message Class:Message class定义了一系列的属性和邮件内容,他的属性制定了邮件的地址信息和内容的结构,包括content type.Message的子类可以实现多种邮件格式的标准,例如,java mail api提供了MimeMessage class,他继承自Message并且实现了RFC822 和MIME 标准,它可以从字节流中构造自己的对象也可以产生字节流进行传播。一个实例化的Message子类持有该信息的内容,也包含收件人和发件人的地址信息,次信息的结构以及信息体的content type.
Address class : 是一个抽象类,代表了邮件的地址
BodyPart class :是一个抽象类而且继承了Part接口,他定义了Part所声明的属性和内容体,他并不想Message对象那样,他的属性集合中不包括from ,to ,subject,replyTo等字段信息。BodyPart是需要被添加到Multipart中的。而一个BodyPart既可以包含一个新的Multipart对象也可以包含一个DataHandler对象。
Multipart class :Multipart class实现了复杂信息,一个Multipart message他的content type 被定义为multipart.这个Multipart 是一个容器类他包含了若干的饿BodyPart,
各对象结构关系图如下
Java mail session
一个Java mail session 管理者配置选项和用户认证信息来和信息系统进行交互,他是用java.util.Properties类来构造,Properties里中含有smtp主机名,用户名密码和其他一些共享的信息。
他有两种创建方式
To create a Session using a static factory method: Session session = Session.getInstance(props, authenticator); To create the default shared session, or to access the default shared session: Session defaultSession =Session.getDefaultInstance(props, authenticator);
Authenticator对象控制着Session的安全方面,当一个邮件系统需要密码登陆的时候通过回调的方式和用户关联,获得此Authenticator中的用户名密码,因此他间接的控制着对默认session的访问。
Using the JavaMail API
1.一个邮件客户端通常通过创建一个session开始邮件处理任务 Session session = Session.getInstance(props, authenticator); 2. 设置传输协议 javax.mail.Transport transport = mailSession.getTransport("smtp"); 3. 创建MimeMessage,并设置from ,to以及设置主题 MimeMessage msg = new javax.mail.internet.MimeMessage(session);
InternetAddress sendFrom = new InternetAddress(from); msg.setFrom(sendFrom); // 设置发送人地址
InternetAddress sendTo = new InternetAddress(to); msg.setRecipient(MimeMessage.RecipientType.TO, sendTo);
msg.setSubject(subject, "gb2312");
4.创建Multipart Multipart multipart = new MimeMultipart();
5.创建MimeBodyPart(不带附件,邮件内容为html格式)
MimeBodyPart part1= new MimeBodyPart();
part.setContent("<meta http-equiv=Content-Type content=text/html;charset=gb2312>"+text,"text/html;charset=GB2312");
6.创建MimeBodyPart(带附件)
MimeBodyPart part2 = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(file); part.setDataHandler(new DataHandler(fileds));
part.setFileName(MimeUtility.encodeWord(fileName, "gb2312", null));
7.将MimeBodyPart添加进Multipart,并将Multipart添加进Message
multipart.addBodyPart(part1);
multipart.addBodyPart(part2);
msg.setContent(multipart);
8.发送邮件
msg.setSentDate(new Date());// 设置信件头的发送日期 mMsg.saveChanges(); transport.connect(host, userName, pwd);//访问邮件服务器 transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());//发送信息 transport.close();
java mail api 例子
SendMail.java
package barley.util; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; /** * * @author barley * 用此类来发送电子邮件 * */ public class SendMail { public static String TEXT = "text/plain;charset=gb2312"; public static String HTML = "text/html;charset=gb2312"; private String host; //邮件服务器 private boolean needAuth; //是否需要认证 /** * 默认构造方法 * 默认smtp主机为163邮件服务器 * 默认需要到服务器验证用户密码是否正确 */ public SendMail(){ host = "smtp.163.com"; //默认使用163邮件服务器 needAuth = true; } /** * 构造方法 * @param needAuth 是否发送用户名密码到服务器验证 */ public SendMail(boolean needAuth){ host = "smtp.163.com"; //默认使用163邮件服务器 this.needAuth = needAuth; } /** * 构造方法 * @param host smtp主机 * @param needAuth 是否发送用户名密码到服务器验证 */ public SendMail(String host,boolean needAuth){ this.host = host; this.needAuth = needAuth; } /** * 获得邮件会话 * @param user * @param pwd * @return */ private Session getSession(String user , String pwd){ Properties props = new Properties(); Session mailSession = null; props = java.lang.System.getProperties(); props.put("mail.smtp.host", host); if(needAuth){ props.put("mail.smtp.auth", "true"); MyAuthenticator myAuther = new MyAuthenticator (user, pwd); mailSession = Session.getInstance(props, (Authenticator) myAuther); }else{ mailSession = Session.getInstance(props); } return mailSession; } /** * 设置发件人和收件人 * @param mimeMsg MIME邮件对象 * @param from 发件人 * @param to 收件人 * @throws MessagingException */ private void setFromAndTo(Message mimeMsg , String from ,String to) throws MessagingException{ if (null != from && !"".equals(from)) { InternetAddress sendFrom = new InternetAddress(from); mimeMsg.setFrom(sendFrom); // 设置发送人地址 } System.out.println("发送到:" + to); InternetAddress sendTo = new InternetAddress(to); mimeMsg.setRecipient(MimeMessage.RecipientType.TO, sendTo); } /** * 设置邮件主题 * @param mimeMsg MIME邮件对象 * @param subject 主题名 * @throws MessagingException */ private void setSubject(Message mimeMsg , String subject) throws MessagingException{ mimeMsg.setSubject(subject); } /** * 添加邮件正文,html格式 * @param text 邮件正文内容 * @return MimeBodyPart * @throws MessagingException */ private MimeBodyPart getBodyPart(String text) throws MessagingException{ MimeBodyPart part = new MimeBodyPart(); part.setContent("<meta http-equiv=Content-Type content=text/html;charset=gb2312>"+text,"text/html;charset=GB2312"); return part; } /** * 添加附件 * @param file 附件文件名 * @return MimeBodyPart * @throws MessagingException */ private MimeBodyPart getFileAffixPart(String file) throws MessagingException { String fileName = ""; String regex ="////([^////]*)$"; Matcher m = Pattern.compile(regex).matcher(file); while(m.find()){ fileName = m.group(1); } MimeBodyPart part = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(file); part.setDataHandler(new DataHandler(fileds)); try { part.setFileName(MimeUtility.encodeWord(fileName, "gb2312", null)); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block System.out.println("文件名不合法"); e.printStackTrace(); } return part; } /** * 发送不带附件的电子邮件 * @param userName smtp邮件服务器用户名 * @param pwd smtp邮件服务器密码 * @param subject 主题名 * @param from 发件人 * @param to 收件人 * @param text 邮件正文内容 * @throws Exception */ public void send(String userName , String pwd ,String subject, String from, String to, String text) throws Exception{ Session mailSession = getSession(userName , pwd); MimeMessage mimeMsg = null; // MIME邮件对象 Transport transport = mailSession.getTransport("smtp"); // 设置传输协议 mimeMsg = new MimeMessage(mailSession); setFromAndTo(mimeMsg,from,to); setSubject(mimeMsg , subject); Multipart multipart = new MimeMultipart(); MimeBodyPart mainPart = getBodyPart(text); multipart.addBodyPart(mainPart); mimeMsg.setContent(multipart); mimeMsg.setSentDate(new Date());// 设置信件头的发送日期 mimeMsg.saveChanges(); transport.connect(host, userName, pwd);//访问邮件服务器 transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());//发送信息 transport.close(); System.out.println("发送到成功!!!"); } /** * 发送带附件的邮件 * @param userName smtp邮件服务器用户名 * @param pwd smtp邮件服务器密码 * @param subject 主题名 * @param from 发件人 * @param to 收件人 * @param text 邮件正文内容 * @param filenames 附件文件名的数组 * @throws Exception */ public void send(String userName , String pwd ,String subject, String from, String to, String text, String[] filenames) throws Exception{ Session mailSession = getSession(userName , pwd); MimeMessage mimeMsg = null; // MIME邮件对象 Transport transport = mailSession.getTransport("smtp"); // 设置传输协议 mimeMsg = new MimeMessage(mailSession); setFromAndTo(mimeMsg,from,to); setSubject(mimeMsg , subject); Multipart multipart = new MimeMultipart(); MimeBodyPart mainPart = getBodyPart(text); multipart.addBodyPart(mainPart); for(int i =0 ;i<filenames.length ;i++){ MimeBodyPart fileAffix = getFileAffixPart(filenames[i]); multipart.addBodyPart(fileAffix); } mimeMsg.setContent(multipart); mimeMsg.setSentDate(new Date());// 设置信件头的发送日期 mimeMsg.saveChanges(); transport.connect(host, userName, pwd);//访问邮件服务器 transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());//发送信息 transport.close(); System.out.println("发送到成功!!!"); } }
MyAuthenticator.java
package barley.util; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * Smtp认证 * @author Administrator * */ public class MyAuthenticator extends Authenticator { String username = null; String password = null; /** * SMTP身份验证 * @param username * @param password */ public MyAuthenticator(String username, String password) { super(); this.username = username; this.password = password; } /** * @return pass */ public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(this.username, this.password); } }
Test.java
package barley.util; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SendMail sendMail = new SendMail("smtp.sina.com",true); String text = "<html><body>" + "<font color=red>this is s test!</font>"+ "</body></html>"; try { sendMail.send("barley", "******", "test", "[email protected]", "*****@sina.com",text); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这两天需要写一个邮件服务的应用,看了有关的资料,所以写了此文记录一下自己的学习,但是还是有很多不足的,如有错误请各位指点,谢谢