您的位置:首页 > 编程语言 > Java开发

JavaMail类

2016-04-21 16:26 597 查看

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);

//将过滤出的所有邮件设置删除标志;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: