第六讲:使用Store查看邮件(1)
一、邮件接收的体系结构
JavaMail API中定义了一个java.mail.Store类,用于执行邮件的接收任务,该类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类的方法就可以获得用户邮箱中的各个邮件夹的信息。JavaMail中的使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息JavaMail又分别使用了一个Message对象进行封装。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异常。同时调用该方法是要注意两点:
- 指定的邮件夹在邮件服务器上不存在,该方法也将返回指定名称的Folder对象,如果用户想判断得到的邮件夹是否存在还需要调用Folder的exists方法判断。
- 通过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.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();