讲座:采用Store检查邮件(1)

一、邮件接收的体系结构

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

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

1. 从Session对象中获得实现了某种邮件发送协议的Store对象

2. 以某个邮件账户的身份连接上POP3或IMAP4server

3. 调用Store的getFolder方法,获代替表该账户的邮件中的某个邮件夹的Folder对象

4. 调用Folder对象中的getMessages或getMessage方法,获取邮件夹中的全部邮件或某一封邮件

二、Store类

和Transport类一样,javax.mail.Store类也是继承了javax.mail.Service类。

Store类用于连接邮件server,并訪问邮件接收server上的邮件夹。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                                                                                                                                                   
这三种方法运行client与邮件server的连接请求。

会抛出下列异常:

连接认证失败: AuthenticationFailedException

已连接:抛出 IllegalStateException异常

其它原因:抛出MessageException异常                   

isConnected() 用于检測client与邮件server是否已经连接
abstract Folder getFolder(java.lang.String name)

throws MessagingException
用于返回指定名称的邮件夹(Folder)对象

使用getFolder方法式,name指定的是邮件夹的名称。假设client与邮件server没有连接的情况下调用该方法。该方法会抛出MessagingException异常。

同一时候调用该方法是要注意两点:

  1. 指定的邮件夹在邮件server上不存在,该方法也将返回指定名称的Folder对象,假设用户想推断得到的邮件夹是否存在还须要调用Folder的exists方法推断。

  2. 通过POP3协议获得的Store对象调用这种方法时。邮件夹名称仅仅能指定为"INBOX"。

三、Folder类

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

abstract boolean exists()

throws MwessagingException                                                                                                      
推断当前邮件夹在邮件server中是否存在,若client与邮件server已经断开则抛出 MessagingException异常
abstract void open(int mode) 设置client訪问邮件账户的操作权限。

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                                                                                                  底层系统是否支持用于自己定义标记,应用程序仅仅能检索这个属性,而不能设置这个属性
   

设置邮件标记应该注意的问题:为邮件server中的邮件设置邮件标记依赖于详细的邮件协议,比如POP3协议仅仅定义了dele命令,因此POP3server仅仅支持JavaMail中的Flags.Flag.DELETED标记。尽管POP3server不支持除Flags.Flag.DELETED标记以外的其它邮件标记,可是client软件能够为本地硬盘上的邮件设置这些邮件标记。以方便用户管理本地邮件。

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:删除保存在POP3server中的邮件时,应用程序首先要为邮件设置为删除标记,然后调用folder.close(true)方法关闭当前邮件夹对象POP3server才会删除保存在server中的邮件。

在JavaMail的API文档中能够知道Folder类定义了一个名为expunge的方法,该方法的定义就是用来删除邮件夹中全部设置了删除标记的邮件。

事实上应用程序不能调用这种方法来删除保存在POP3server中的邮件,因为POP3本分的限制所导致其不能调用其本身POP3Folder.expunge()方法删除邮件。

而IMAP协议则同意client在邮件server上直接运行邮件删除操作。

IMAP实现类IMAPFolder中提供了IMAPFolder.expunge方法删除邮件事实上事实上直接调用Folder.expunge方法垃圾桶。

版权声明:本文博主原创文章,博客,未经同意不得转载。

讲座:采用Store检查邮件(1)的更多相关文章

  1. Spring Cloud Admin健康检查 邮件、钉钉群通知

    源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin Admin 简介 官方文档:What is Spring ...

  2. Powershell检查邮件队列设置阈值,通过html形式进行邮件告警

    为了完善公司的整体邮件质量,博主通过zabbix监控了exchange的所有微软推荐项目,并写了很多powershell来辅佐, 旨在更大程度上提高整体的邮件性能 这篇文章主要是讲通过powershe ...

  3. IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。

    IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMA ...

  4. Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)

    T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提 ...

  5. xp_sendmail: 由于邮件错误 0x80004005 而失败

    今天收到一封邮件说我们的一台SQL SERVER 2000服务器发送邮件有问题.我测试中发现了如下错误: exec xp_sendmail 'Konglb@esquel.com','hello, 12 ...

  6. 学习笔记Jmail收发邮件

    一.利用Jmail发送邮件  1/// <summary> 2/// 利用Jmail发送邮件 3/// </summary> 4private void SendMailByJ ...

  7. [AX2012]发送广播邮件

    AX 2012可以使用MAPI或者SMTP发送邮件,MAPI是客户端方法,需要outlook的协作,而SMTP则是服务器端方法,要求SMTP允许AOS服务器通过它中继.这里要讲的就是如何通过SMTP发 ...

  8. redmine邮件发送功能配置详解

    redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...

  9. (转) 关于Oracle EBS邮件服务无法使用的报错

    来源http://blog.itpub.net/23850820/viewspace-1060596/ 也可以检查如下网站:http://blog.sina.com.cn/s/blog_5b021b4 ...

随机推荐

  1. DIV+CSS 入门

    玩一小会儿前csdn什么时候,页面上的加qq而微博,我认为这是美好的.牛腩完成.运营商也开始了他真正的学习B/S之旅. 刚開始的时候,我不知道<div>是什么 也不清楚CSS用来干什么的, ...

  2. 30第二建筑Github Page

    从我原来博客的前端传输.链接:http://www.hacke2.cn/create-github-page/ 假设中国每一个程序猿都写博客,那么中国IT届的春天就来了 有同学问我的站点是怎么创建的, ...

  3. hdu4003(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:给定一棵n个节点的树,遍历每条数边都需要费用cost,现在给定k个机器人,要求用这个k个机 ...

  4. orcl 删除重复的行

    delete from FOODDETAIL t where t.id in (select   t.id from FOODDETAIL where t.sendtime>=to_date(' ...

  5. php截取等长UFT8中英文混合字串

    由于需要,想实现“php截取等长UFT8中英文混合字串”,可是网上找了很多代码不是有乱码就是不能实现等长(以一个中文长度为单位,两个英文字母算一个长度,如‘等长’长度为2,‘UTF8’长度也是2). ...

  6. 中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030 cp936是微软自己发布的用在文件系统中的编码方式.而bg2312是中国国家标准.我明白mount -t vfa ...

  7. javascript一元操作符(递增,递减)

    <script type="text/javascript"> var a="1"; var b=false; var c="dd&quo ...

  8. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

  9. cocos2d-x物业现场

    pushScene()和popScene()用法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTYyNjY3MTc=/font/5a6L5L2 ...

  10. javascript面向对象之闭包

    javascript面向对象之闭包 学习javascript一段时间了,自己对闭包作出如下总结,如有某点不妥,请君指出,不胜感激! 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量 ...