<转>JavaMail的三个主要类:
1、Session类
Session类表示了一个基本的邮件会话过程,它提供了一个邮件的生存过程。Session对象需要java.util.Properties对象对其配置邮件环境属性,它利用Properties对象来获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。


2、Message类
在创建了一个邮件会话Session后,再用Message类提供了一封邮件的所有信息。它是一个抽象类,必须由其子类来构造。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子类,可以使用当前的Session对象创建一个新的MimeMessage对象,然后就可以对其进行各种操作。
message.setSubject("This is subject of the e-mail");
//设置邮件的标题
message.setText("Hello,I am a e-mail");
//设置纯文本邮件的内容
InternetAddress sender=new InternetAddress("
cx19830801@163.com ");
//InternetAddress类通过一个合法的e-mail构造出e-mail地址对象
message.setForm(sender);
//设置邮件的发送方地址
InternetAddress receiver=new InternetAddress("
Webmaster@hudax.com ");
message.addRecipient(receiver,RecipientType.TO);
//设置接收方地址
设置接收方地址使用addRecipient方法,地址类型有三种:
RecipientType.TO:e-mail的发送地址;
RecipientType.CC:抄送地址,可以为多个;
RecipientType.BCC:暗送地址,可以为多个。

3、Transport类
邮件发送类。
邮件发送方法:send(message);

e.g
Properties props=new Properties();
Session sendsession = Session.getInstance(props, null);
//使用getInstance方法获取到这个信息
props.put("mail.smtp.host", "smtp.163.com");
//向属性中写入SMTP服务器的地址,为Session设置一个SMTP邮件服务器
props.put("mail.smtp.auth","true");
//用Properties对象的put方法设置了SMTP邮件服务器需要进行权限的认证;
sendsession.setDebug(true);
//用Session对象的setDebug方法设置输出发送邮件时的调试信息;可在Tomcat服务器上看到同SMTP邮件服务器交互过程中的输出信息。
MimeMessage message=new MimeMessage(sendsession);
//MimeMessage是Message的子类,可以使用当前的Session对象创建一个新的MimeMessage对象,然后就可以对其进行各种操作。
message.setFrom(new InternetAddress(request.getParameter("from")));
//设置发信人地址
message.setRecipient(Message.RecipientType.TO,new InternetAddress(request.getParameter("to")));
//设置收信人地址
message.setSubject(new String(request.getParameter("subject").getBytes("ISO8859_1"),"GBK"));
//设置e-mail标题
message.setSentDate(new Date());
//设置e-mail发送时间
message.setText(new String(request.getParameter("text").getBytes("ISO8859_1"),"GBK"));
//设置e-mail内容
message.saveChanges();
//保存对于Email的修改,用message对象的saveChanges方法将邮件信息保存起来;
Transport transport=sendsession.getTransport("smtp");
//由当前的session对象使用方法getTransport创建并初始化Transport对象
transport.connect("smtp.163.com","username","password");
//连接到SMTP服务器
transport.sendMessage(message,message.getAllRecipients());
//发送e-mail
transport.close();
//关闭Transport连接

发送带有附件的邮件:
1、BodyPart类
BodyPart类表示多部分的MIME信息中某一个部分的信息内容,它是一个抽象类,需要用其子类MimeBodyPart创建。
BodyPart messageBodyPart=new MimeBodyPart();
通常邮件的正文是一个BodyPart对象,附件则是另一个BodyPart对象。

2、MultiPart类
MultiPart类表示多部分的MIME信息的内容,它是一个抽象类,需要用其子类MimeMultipart来创建。还可以通过其方法addBodyPart()来创建。
Multipart multipart=new MimeMultipart();
将代表邮件正文的BodyPart对象和代表邮件附件的BodyPart对象分别加入到MimeMultipart对象中。

3、DataSource类
DataSource类表示本地文件和服务器可以直接访问的资源,它是一个抽象类,用其子类FileDataSource来创建。
FileDataSource fds=new FileDataSource("c:/test.doc");

4、DataHandler类
DataHandler为不同的数据源和数据格式提供提供了一个统一的接口。
messageBodyPart.setDataHandler(new DataHandler(fds));
附件被封装到一个DataHandler对象,BodyPart对象可以用方法setDataHandler将封装了附件的DataHandler对象加进来。

发送附件时的处理过程:
BodyPart messageBodyPart=new MimeBodyPart();
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//在要发送附件时,先建立代表邮件正文的BodyPart对象,并把它加到Multipart对象中去
messageBodyPart=new MimeBodyPart();
//建立代表邮件附件部分的BodyPart对象
DataSource source=new FileDataSource(attachment);
messageBodyPart.setDataHandler(new DataHandler(source));
用setDataHandler方法将获取到的附件包含进来
messageBodyPart.setFileName(attachment);
//设置附件文件名
multipart.addBodyPart(messageBodyPart);
//将与附件相关的内容设置好之后,就可以把代表此附件部分的BodyPart对象加到Multipart对象中去了,最后将Multipart对象放到代表邮件信息的Message对象中,这样就可以发送带有附件的邮件了。


接收邮件:
1、URLName类
URLName类实际上是对于某台邮件服务器上某个用户的一次操作的唯一标识,它的格式为:
协议名称://用户名:密码@邮件服务器/
URLName irln=new URLName("pop3://username:password@163.com/");

2、Store类
Store类是用于接收邮件的类,它对邮件进行读、写、监视、查找等操作。接收邮件时首先要连接到邮件服务器上的一个邮箱,这需要调用Session对象的getStore方法来创建一个Store对象。
Store store=session.getStore("pop3");
//这个方法要设置Store对象所使用的协议,通常为POP3;
store.connect("pop.163.com","username","password");
//在创建了Store对象之后,可以使用它的connect方法连接到远程邮件服务器中的邮箱。

3、Folder类
在连接到邮箱之后,就可以打开包含邮件的消息文件夹了,打开消息文件夹需要先使用Store对象的getFolder方法创建一个Folder对象作为消息文件夹。
Folder folder=store.getFolder("INBOX");
//参数用来设置消息文件夹的名字,通常设为INBOX,因为POP3协议只支持唯一的消息文件夹INBOX。
使用Folder类的open方法来打开消息文件夹:
folder.open(Folder.READ_ONLY);
它有两种可选模式:READ_ONLY和READ_WRITE
要从消息文件夹中取出邮件,可以使用Folder类的getMessage方法或getMessages方法。
Message message=inbox.getMessage(i);
//方法getMessage返回以其参数为索引的Message对象
Message message[]=folder.getMessages();
//方法getMessages返回一个Message对象数组
int count=folder.getMessageCount();
//使用Folder类的getMessageCount()得到消息文件夹中的邮件总数

4、Message类
与前面的Message类相同,在这里介绍它在显示邮件列表和删除邮件时所使用的一些方法。
(1)、方法getSubject得到一封邮件的标题;
(2)、方法isSet用来判断一封邮件是否被标记为删除(DELETED)、是否用户已经收取过(SEEN)、是否被回复过(ANSWERED)、是否是一个草稿(DRAFT)等等;
(3)、方法setFlag设置一封邮件为待删除。

在接收和检索邮件之后,还要关闭程序使用到的资源,
folder.close(true);
store.cloase();
这两个方法关闭收件箱和到邮件服务器的连接。


显示邮件详细信息的Message类的方法:
1、Address[] getFrom():得到发件人的地址,返回一个Address类的对象数组;
2、Address[] getRecipients(Message.RecipientType.TO):得到收件人的地址列表;
3、Address[] getSubject():得到邮件标题
4、Address[] getContent():得到普通文本邮件的详细内容;
5、Date getSentDate():得到邮件发送的时间;
6、Date getReceivedDate():得到接受邮件的时间;
7、Boolean isMimeType("text/plain"):判断邮件的MIME(多用途的Internet邮件扩展)类型;
Address类是邮件的地址,它是一个抽象类,可以由其子类InternetAddress来实现。

接收带附件的邮件:
先用Message对象的isMimeType方法判断该邮件是否是一个多部分内容的邮件:
if(message.isMimeType("multipart/*"))
如果是的话,就表明该邮件带有附件,这是可以用Message对象的getContent方法获得代表该邮件的多部分内容的Multipart对象:
Multipart multipart=(Multipart)message.getContent();
然后依次获取Multipart对象的每个部分,并用方法getDisposition获得该部分的属性:
Part p=multipart.getBodypart(i);
String disposition=p.getDisposition();
如果该部分的属性是Part.ATTACHMENT或Part.INLINE,就表明它是附件的内容;如果该部分的属性为null,就表明它是普通文本的内容,在对属性进行判断之后,就可以进行相应的处理了:
if((disposition!=null)&&(disposition.equals(Part.ATTACHMENT)||disposition.equals(Part.INLINE)))
{
........
}
else if(disposition==null)
{
if(p.isMimeType("text/plain"))
{
.....
}
}

下载附件的处理:
先设置附件的类型属性,并生成下载的头信息:
response.setContentType(p.getContentType());
response.setHeader("Content-Disposition","attachment;filename=\""+p.getFileName()+"\"");
然后设置下载过程中的输入流和输出流,为下载附件做好准备工作:
OutputStream os=response.getOutputStream();
InputStream is=p.getInputStream();
最后就可以执行下载的操作了:
int c=is.read();
while(c!=-1)
{
os.write(c);
c=is.read();
}


邮件过滤:
要对邮件进行过滤,需要先查找出所有符合过滤条件的邮件,然后对这些邮件设置待删除标记,最后在关闭消息文件夹时真正删除它们。JavaMail提供了一个包javax.mail.search专门用来查找符合条件的邮件,因此可以这样来实现对邮件的过滤:
建立一个SearchTerm对象,它是一个抽象类,需要用其子类来构造,常用的有以下这些子类,这些字类的构造方法中参数就是过滤的规则,满足这些规则的邮件将被过滤掉。
AndTerm:查找同时满足多个条件的邮件;
OrTerm:只要邮件满足多个条件中的某一个条件,就查找出来;
NotTerm:查找不满足条件的邮件;
SentDateTerm:查找某个特定时间发送出来的邮件;
BodyTerm:查找正文部分的内容符合条件的邮件;
SubjectTerm:查找标题部分内容符合条件的邮件;
FromTerm:如果邮件的发件人地址头满足条件,就查找出来;
FromStringTerm:如果邮件发件人的地址字符串满足条件,就查找出来;
RecipientTerm:如果邮件的收件人地址头满足条件,就查找出来;
RecipientStringTerm:如果邮件收件人的地址字符串满足条件,就查找出来
例如:要设立这样的一个过滤规则,凡是标题中含有“惊喜”的邮件或者是由
webmaster@hudax.com 发送过来的邮件都将被过滤。
SearchTerm st=new OrTerm(new SubjectTerm("惊喜"),new FromStringTerm("
webmaster@hudax.com "));
//建立SearchTerm对象;
Message[] message=folder.search(st);
//设立了过滤规则之后,调用Folder对象的search方法在接收到的邮件中寻找符合过滤条件的邮件;并将它们作为Message的对象数组返回;
message.setflsg(Flags.Flag.DELETED,true);
//将过滤出的所有邮件设置删除标志;