第六讲:使用Store查看邮件(1)

来源:互联网 发布:淘宝美工工具 编辑:程序博客网 时间:2024/06/05 05:46

第六讲:使用Store查看邮件(1)


一、邮件接收的体系结构
JavaMail API中定义了一个java.mail.Store类,用于执行邮件的接收任务,该类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类的方法就可以获得用户邮箱中的各个邮件夹的信息。JavaMail中的使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息JavaMail又分别使用了一个Message对象进行封装。JavaMail中接收邮件主要涉及的如下图所示:

图1:JavaMail Store的API(取自《JavaMail开发详解》)

1. 从Session对象中获得实现了某种邮件发送协议的Store对象
2. 以某个邮件账户的身份连接上POP3或IMAP4服务器
3. 调用Store的getFolder方法,获取代表该账户的邮件中的某个邮件夹的Folder对象
4. 调用Folder对象中的getMessages或getMessage方法,获取邮件夹中的所有邮件或某一封邮件


二、Store类

和Transport类一样,javax.mail.Store类也是继承了javax.mail.Service类。Store类用于连接邮件服务器,并访问邮件接收服务器上的邮件夹。Store类是一个抽象类。Sun公司在mail.jar包的com/sun/mail/pop3目录中提供的POP3的实现子类POP3Store,其实现了POP3协议的底层实施细节。可以通过Session对象中定义的mail.store.protocol属性构建相应的协议实现类,并返回实例对象。其常用方法有:

connect() throws MessagingException
connect(String host, String user, String password) 
throws MessagingException
connect(String host, String port, String user, String password)
throws MessagingException                                                                                                                                                   
这三种方法执行客户端与邮件服务器的连接请求。会抛出下列异常:
连接认证失败: AuthenticationFailedException
已连接:抛出 IllegalStateException异常
其他原因:抛出MessageException异常                   
isConnected()用于检测客户端与邮件服务器是否已经连接abstract Folder getFolder(java.lang.String name)
throws MessagingException
用于返回指定名称的邮件夹(Folder)对象

使用getFolder方法式,name指定的是邮件夹的名称,如果客户端与邮件服务器没有连接的情况下调用该方法,该方法会抛出MessagingException异常。同时调用该方法是要注意两点:

  1. 指定的邮件夹在邮件服务器上不存在,该方法也将返回指定名称的Folder对象,如果用户想判断得到的邮件夹是否存在还需要调用Folder的exists方法判断。
  2. 通过POP3协议获得的Store对象调用这个方法时,邮件夹名称只能指定为"INBOX"。

三、Folder类

Folder类是一个抽象类,应用程序通过调用Store的getFolder方法获得Folder类的实例对象,Folder类常用的方法如下:

abstract boolean exists()
throws MwessagingException                                                                                                      
判断当前邮件夹在邮件服务器中是否存在,若客户端与邮件服务器已经断开则抛出 MessagingException异常abstract void open(int mode)设置客户端访问邮件账户的操作权限。
Folder.READ_ONLY:只能读取邮件夹中的邮件
Folder.READ_WRITE:可以修改并且读取其中的邮件
abstract Message getMessage(int msgnum)                                                                                             从邮件夹中获取指定邮件对象abstract
Message[] getMessages()
Message[] getMessages(int start, int end)
Message[] getMessage(int[] msgnum)
分别是返回所有邮件、指定范围内的所有邮件对象abstract
Message[] serach(SearchTerm term)
Message[] search(SearchTerm term, Message[] msgs)                                                                                                                                                                 
搜索邮件夹中符合条件的邮件。
SearchTerm类在后面介绍,第一个方法搜索整个邮件夹,而后者搜索的范围有msgs数组指定
abstract int getMessageCount()返回邮件夹中邮件的总数abstract void close(boolean expunge)关闭当前的Folder对象。expunge表示在删除对象前是否删除已经设置了删除标记的邮件从而更新folder

四、Flags类

mail.jar包中的Flags类代表一组邮件标记的集合,邮件标记用于标识邮件的使用状况,例如:删除标记、已读标记等。JavaMail中的邮件标记分为系统标记和用户标记,系统标记是指Flags.Flag这个内部类中表示的邮件标记,用户标记指用户自定义的标记。
Flags.Flag是Flags的内部类,该内部类定义了一些常量分别表示各种不同的邮件标记,这些标记都是系统标记。

Flags.Flag中定义的常量常量说明Flags.Flag.ANSWERED邮件回复标记,用于标识邮件是否已经回复Flags.Flag.DELETED邮件删除标记Flags.Flag.DRAFT草稿邮件标记Flags.Flag.FLAGGED用于表示邮件是否为回收站中的邮件Flags.Flag.RECENT新邮件标记,用于表示邮件是否是新邮件Flags.Flag.SEEN邮件阅读标记,用于表示邮件是否已经阅读Flags.Flag.USER                                                                                                 底层系统是否支持用于自定义标记,应用程序只能检索这个属性,而不能设置这个属性  

设置邮件标记应该注意的问题:为邮件服务器中的邮件设置邮件标记依赖于具体的邮件协议,例如POP3协议只定义了dele命令,因此POP3服务器只支持JavaMail中的Flags.Flag.DELETED标记。虽然POP3服务器不支持除Flags.Flag.DELETED标记以外的其他邮件标记,但是客户端软件可以为本地硬盘上的邮件设置这些邮件标记,以方便用户管理本地邮件。


Flags类中的常用方法Flags()
Flags(Flags flags)
Flags(Flags.Flag flag)
Flags(java.lang.String flag)

构造一个空的Flags对象
用指定的Flags对象构造一个Flags对象
用指定的系统标记构造一盒Flags对象
用于指定的用户标记构造一个Flags对象
void add(Flags.Flag flag)
void add(java.lang.String flag)
void add(Flags flag)                                                                                                                                                            
增加指定的系统标记到Flags对象
增加指定的用户标记到Flags对象
增加一个Flags对象中包含的所有邮件标记到当前的Flags对象中
void remove(Flags.Flag flag)
void remove(java.lang.String flag)
void remove(Flags flag)
从当前的Flags对象中删除指定的系统标记
从当前的Flags对象中删除用户标记
从当前Flags对象中删除参数Flags对中定义的所有邮件标记
boolean contains(Flags.Flag flag)
boolean contains(java.lang.String flag)
boolean contains(Flags flag)                          
检查当前对象中是否包含指定的系统标记
检查当前对象中是否包含指定的用户标记
检查当前对象中是否包含指定的Flags对象中的所有邮件标记
Flags.Flag[] getSystemFlags()返回Flags对象中的所有系统标记String[] getUserFlags()返回Flags对象中所有的用户标记Flags getFlags()
void setFlags(Flags flag, boolean set)
getFlags方法用于得到Message对象中设置的邮件标记
setFlags方法用于为Message对象设置邮件标记,其中set参数用于表示flags对象代表的邮件标记是设置到Message对象中的,还是从Message对象中删除。当set为true时表示设置,false表示删除

//设置邮件标识folder.open(Folder.READ_WRITE);  //以读写模式打开邮件夹message.setFlag(Flags.Flag,true);  //设置邮件标记message.saveChange();                //保存设置//清除邮件标识folder.open(Folder.READ_WRITE);Flags flags = messgae.getFlags();if(flags.contains(Flags.Flag)){message.setFlag(Flags.Flag, false);}message.saveChanges();


PS:删除保存在POP3服务器中的邮件时,应用程序首先要为邮件设置为删除标记,然后调用folder.close(true)方法关闭当前邮件夹对象POP3服务器才会删除保存在服务器中的邮件。在JavaMail的API文档中可以知道Folder类定义了一个名为expunge的方法,该方法的定义就是用来删除邮件夹中所有设置了删除标记的邮件。事实上应用程序不能调用这个方法来删除保存在POP3服务器中的邮件,由于POP3本分的限制所导致其不能调用其本身POP3Folder.expunge()方法删除邮件。而IMAP协议则允许客户端在邮件服务器上直接执行邮件删除操作。IMAP实现类IMAPFolder中提供了IMAPFolder.expunge方法删除邮件其实其实直接调用Folder.expunge中的方法删除邮件。


0 0