JavaMail学习

JavaMail是API,是一个标准的Java扩展,它是J2EE的范畴,在J2EE开发过程中可能会需要用到这个API。在学习JavaMail之前,有必须要对现在的互联网的邮件协议进行有个大体的了解。
邮件协议
在Internet中,常用的邮件操作相关的协议有3个—SMTP、POP、IMAP。
简单邮件传输协议(simple mail transferprotocol,SMTP),这个协议是邮件服务器之间相互发送邮件的协议,也是客户端利用该协议向邮件服务器端发送邮件的协议。一般一个邮件首先会被传送到某一个邮件服务器,再被邮件服务器分发到一个或多个目标邮件服务器。
邮局协议第3版(postoffice protocol version 3,POP3),协议主要用于从邮件服务器检索以得到新的邮件,大量的客户机从邮件服务器接收邮件就是使用POP3协议。
因特网消息访问协议(internet messager accessprotocol,IMAP),该协议比POP3功能更加强大,它可在接收邮件时,把邮件保存在邮件服务器中,既可在服务器中保留邮件也可把邮件下载
安装与配置JavaMail
由于JavaMail是一个扩展的部分,要进行发送接收邮件,需要两个包:
一个是JavaMail,这个包含了对SMTP、POP3、IMAP提供了支持,封装了电子邮件功能中的邮件对象、发送功能、身份认证、接收等。当前最新的版本是1.5
一个是JAF(JavaBeans Activation Framework),主要用来描述和显示邮件中的相关内容的,当前最新的版本是1.1.1
  具体所需要的包,可以在本文的附件中直接下载。
邮件发送与接收
JavaMail包中的类比较多,主要用到的有会话类、地址类、邮件类、邮件发送类、邮件接收类和邮件文件夹类这些常用的类。
会话类(Session),主要用来创建邮件对象、实现邮件对象中数据的封装并可指定邮件服务器认证的客户端属性。它表示程序与某一个邮件服务器即将建立通信,在建立的过程可以进行口令认证。
地址类(Address),这个地址类主要是表示邮件发送人和邮件接收人的地址,一般主要用的是InternetAddress。
邮件类(Message),邮件消息的主要类,它包含了邮件中的所有部分,继承自一个接口Part,一般在使用的过程中直接是利用它的子类MimeMessage
邮件发送类(Transport),一般是从一个会话中获取一个邮件发送类的实例,将已经写好的邮件利用SMTP协议发送到指定的邮件服务器,在发送的过程中,首先根据指定口令连接到邮件服务器,再发送邮件。
邮件接收类(Store),这个其实就是邮件服务器中的存储库,里面放着所有的邮件文件夹
邮件文件夹类(Folder),该文件夹就是消息的具体所在文件夹,默认的邮件均在INBOX文件中。
发送邮件
基本步骤:
1 利用Properties来设置Session,一般主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false
2 利用Session.getInstance(Properties)启动一个与邮件服务器的连接
3 根据获取的Session来传建一个消息Message
4 定义消息的发信人地址InternetAddress和消息的收信人地址。
5 设置消息发送的主题和内容
6 利用Message.saveChanges()来存储填写的邮件信息
7 根据Session.getTransport("smtp")获取邮件发送类
8 利用发送人的用户名和密码连接到指定的邮件服务器
9 将该消息发送
注意:发送消息最重要的是要正确的找到发送消息的邮件服务器名,至于收信人的邮箱无所谓,可以是任意正确的邮件,譬如发送人是163邮件,可以发送给搜狐邮箱,新浪邮箱,QQ邮箱。
示例代码:



import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class JaveMailTest {
    public static void main(String[] args) {
    	Properties props = new Properties();
    	props.setProperty("mail.smtp.auth", "true");//必须 普通客户端
    	props.setProperty("mail.transport.protocol", "smtp");//必须选择协议
    	Session session = Session.getDefaultInstance(props);
    	session.setDebug(true);//设置debug模式   在控制台看到交互信息
    	Message msg = new MimeMessage(session);  //建立一个要发送的信息
    	try {
			msg.setSubject("第一个JavaMail例子");//设置主题
			msg.setFrom(new InternetAddress("[email protected]"));//发件人邮箱号
			//下面是模拟发送带附件的邮件
            //新建一个MimeMultipart对象用来存放多个BodyPart对象
            Multipart mtp=new MimeMultipart();
            //------设置信件文本内容------
            //新建一个存放信件内容的BodyPart对象
            BodyPart mdp=new MimeBodyPart();
            //给BodyPart对象设置内容和格式/编码方式
            mdp.setContent("hello","text/html;charset=gb2312");
            //将含有信件内容的BodyPart加入到MimeMultipart对象中
            mtp.addBodyPart(mdp);
                                
            //设置信件的附件(用本地机上的文件作为附件)
            mdp=new MimeBodyPart();
            FileDataSource fds=new FileDataSource("f:/PiOnecalBO.class");
            DataHandler dh=new DataHandler(fds);
            mdp.setFileName("PiOnecalBO.class");//可以和原文件名不一致
            mdp.setDataHandler(dh);
            mtp.addBodyPart(mdp);
            //把mtp作为消息对象的内容
            msg.setContent(mtp);
			
			Transport transport = session.getTransport();//发送信息的工具
			transport.connect("smtp.exmail.qq.com", 25, "[email protected]", "123");//发件人邮箱号 和密码
			transport.sendMessage(msg, new Address[] { new InternetAddress(
			"[email protected]") });//对方的地址
			transport.close();
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (NoSuchProviderException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
    }
}



测试过程中出现错误:NoClassDefFoundError: com/sun/mail/util/LineInputStream
解决方案:http://mrhouzhibin.blog.163.com/blog/static/19459624120121921546959/

注意:
用QQ邮箱发邮件时,需要把发送邮箱设置下如下:



同时需要两个jar包:mail-1.4.3.jar和activation-1.1.jar

你可能感兴趣的:(javamail)