本文包括两部分,一、JavaMail API讲解 二、编写一个JavaMail发送邮件的程序
一、JavaMail API的介绍
1.什么是Java Mail
a.可以直接采用Socket编程实现与邮件服务器的交互,不过需要处理诸于复杂的MIME格式内容的邮件等细节,非常麻烦。
b.JavaMail是SUN公司为方便开发人员实现邮件的接收和发送功能提供的一套标准开发包。它支持一些常用的协议:SMTP,POP3,IMAP。
c.JavaMail也提供了能够创建复杂MIME格式的邮件的相关API.
d. MIME是因特网邮件扩展标准(Multipurpose Internet Mail Extensions).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.
2.下载地址:点一下人家就可以下载啦
说明:JDK1.6以上(包括1.6)版本只要下载JavaMail包就行了,不然仍需要辅助JAF框架,处理邮件内容。
3.JavaMail的体系结构和API分类
a.JavaMail API按照功能可以分为3大类
创建和解析邮件内容的API:核心类Message,它的实例代表一封电子邮件
发送邮件的API:核心类Transport类,它的实例代表实现了某个邮件发送协议的邮件发送对象,如SMTP协议。
接收邮件的API:核心类Store,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,如POP协议。
b.Session类
用于定义整个应用程序所用的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息。如邮件服务器的主机名,端口号,采用的邮件接收和发送协议等。
详细可参考这篇文章中间的文字说明部分:JavaMail 深入浅出
4.JAF(JavaBeans Activation Framework)
下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jaf-1.1-fr-oth-JPR
a.JAF是一个专用的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口。
b.JAF的主要作用在于让Java应用程序知道如何对一个数据源进行常看、编辑和打印等操作。对于通过JAF封装的数据,应用程序通过JAF接口能完成如下的功能
访问数据源中的数据
得知数据源的数据类型
获知可对数据源的各种操作
用户对数据进行某种操作时,自动创建进行该种操作所需的实例对象。
c.JavaMail API可以利用JAF从某种数据源中读取数据和货值数据的MIME类型,用这些数据生成MIME消息中的消息体和消息类型。
5.注意:mailapi.jar中的类分为java mail api和service provider,类似于JDBC API和数据库驱动一样,不需要provider包(smtp.jar、pop.jar等)编译没问题,但是运行会报错,需要导入provider包。
一般使用mail.jar不需要考虑上面的问题
二、编写一个JavaMail发送邮件的程序
新建工程JavaMail。
编码思路:先写主体框架,然后补充细节。
主要步骤:【类比:卫星(message)、火箭(transport)、火箭发送卫星(transport.send(message)】
1.创建邮件服务器的网络连接信息的Session对象
2.创建代表邮件内容的Message对象
3.创建Transport对象,连接服务器,发送Message对象,关闭连接。
package info.zoio.javamail; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Demo { public static void main(String[] args) { // TODO Auto-generated method stub Properties props = new Properties(); //props.setProperty("mail.debug", "true"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); Session session = Session.getInstance(props); session.setDebug(true);//调试 Message msg = new MimeMessage(session); Transport transport = null; try { transport = session.getTransport(); msg.setText("the message based on JavaMail API!"); msg.setSubject("java mail api !"); msg.setFrom(new InternetAddress("[email protected]")); transport.connect("smtp.126.com", 25, "java_mail_test", "h123456"); transport.sendMessage(msg,new Address[]{new InternetAddress("[email protected]")}); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { transport.close(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
使用Authenticator类实现用户信息验证,代码如下:
package info.zoio.javamail; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class Demo2 { public static void main(String[] args) { Properties props = new Properties(); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", "smtp.126.com"); //props.setProperty("mail.port", "25"); Session session = Session.getInstance(props, new Authenticator() { //策略模式 protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("java_mail_test", "h123456"); } }); session.setDebug(true); Message msg = new MimeMessage(session); try { msg.setFrom(new InternetAddress("[email protected]")); msg.setSubject("JavaMail API"); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected],[email protected]")); msg.setContent("<span style='color:red'>JavaMail开发测试</span>","text/html;charset=GBK"); Transport.send(msg); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
补充:邮件接受测试可参考这篇文章的代码:JavaMail:带附件的邮件格式解析
(完)