讲座:采用Store检查邮件(1)
讲座:采用Store检查邮件(1)
一、邮件接收的体系结构
JavaMail API中定义了一个java.mail.Store类,用于运行邮件的接收任务,该类的实例对象封装了某种邮件接收协议的底层实施细节。应用程序调用这个类的方法就能够获得用户邮箱中的各个邮件夹的信息。JavaMail中的使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又能够获得该邮件夹中的全部邮件信息,而每封邮件信息JavaMail又分别使用了一个Message对象进行封装。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的连接请求。
会抛出下列异常: |
| isConnected() | 用于检測client与邮件server是否已经连接 |
| abstract Folder getFolder(java.lang.String name) throws MessagingException |
用于返回指定名称的邮件夹(Folder)对象 |
使用getFolder方法式,name指定的是邮件夹的名称。假设client与邮件server没有连接的情况下调用该方法。该方法会抛出MessagingException异常。
同一时候调用该方法是要注意两点:
- 指定的邮件夹在邮件server上不存在,该方法也将返回指定名称的Folder对象,假设用户想推断得到的邮件夹是否存在还须要调用Folder的exists方法推断。
- 通过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:仅仅能读取邮件夹中的邮件 |
| 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.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)的更多相关文章
- Spring Cloud Admin健康检查 邮件、钉钉群通知
源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin Admin 简介 官方文档:What is Spring ...
- Powershell检查邮件队列设置阈值,通过html形式进行邮件告警
为了完善公司的整体邮件质量,博主通过zabbix监控了exchange的所有微软推荐项目,并写了很多powershell来辅佐, 旨在更大程度上提高整体的邮件性能 这篇文章主要是讲通过powershe ...
- IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。
IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMA ...
- Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)
T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提 ...
- xp_sendmail: 由于邮件错误 0x80004005 而失败
今天收到一封邮件说我们的一台SQL SERVER 2000服务器发送邮件有问题.我测试中发现了如下错误: exec xp_sendmail 'Konglb@esquel.com','hello, 12 ...
- 学习笔记Jmail收发邮件
一.利用Jmail发送邮件 1/// <summary> 2/// 利用Jmail发送邮件 3/// </summary> 4private void SendMailByJ ...
- [AX2012]发送广播邮件
AX 2012可以使用MAPI或者SMTP发送邮件,MAPI是客户端方法,需要outlook的协作,而SMTP则是服务器端方法,要求SMTP允许AOS服务器通过它中继.这里要讲的就是如何通过SMTP发 ...
- redmine邮件发送功能配置详解
redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...
- (转) 关于Oracle EBS邮件服务无法使用的报错
来源http://blog.itpub.net/23850820/viewspace-1060596/ 也可以检查如下网站:http://blog.sina.com.cn/s/blog_5b021b4 ...
随机推荐
- 每日算法之三十八:Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- urses.ascii.ispunct(ch):
Nullege: A Search Engine for Python source code urses.ascii.ispunct(ch): TypeError: 'unicode' object ...
- Hadoop里的Partitioner
人们对于Mapreduce程序刚開始时都觉得仅仅须要一个reduce就够了. 毕竟,在你处理数据之前一个reducer已经把数据都分好类了,有谁不喜欢分好类的数据呢. 可是这样我们就忽略了并行计算的优 ...
- GDAL切割重采样遥感图像
一个小测试程序开发全过程实录,完全新手入门级的实例,如果你还在为处理大影像而发愁,来试试这个称手的工具吧. Imagec 开发日记 2013-6-25 需求: 影像数据切割,重采样 数据切割的要求是简 ...
- 通过Java字节码发现有趣的内幕之String篇(上)(转)
原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...
- IOS开发笔记 - 基于wsdl2objc调用webservice
为了方便在ios下调用webserivce,找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用. 下面做个小例子. 1.首先是用Asp.net搭建一个测试的webs ...
- Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)
nagios博大精深,可以以shell.perl等语句为nagios写插件,来满足自己监控的需要.本文写mysql中tps.qps的插件,并把收集到的结果以图形形式展现出来,这样输出的结果就有一定的要 ...
- 《JavaScript设计模式与开发实践》读书笔记之模板方法模式
1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Bev ...
- Java命令参数说明
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令 JAVA_HOME"bin"java –option 来启动,-option为虚 ...
- Akka边学边写(3)-- ByteString介绍
Akka的IO层设计能够參考这篇文档,本文简介一下ByteString的设计. Immutable消息 Actor之间是通过消息沟通的.但为了避免同步问题,消息必须是Immutable. 因此.Akk ...