企业级邮件服务器Apache James介绍(2)-用matchers 和 mailets构建基
来源:Linuxdby.com
作者:Webmaster
时间:2007-05-31
点击:
[
收藏] [
投稿]
增加两个新的APIs增强这个e-mail服务器 级别: 中级
Claude Duguay (claude.duguay@verizon.net) Chief Architect, Arcessa, Inc. June 10, 2003
这是讨论用Apache组织提供的James邮件服务器开发应用程序的第二篇文章。这篇文章的内容超出了James基础设施这些基础知识的介绍,它实现了一个实际的应用程序。通过将用户状态定义为available 和 unavailable,程序可以为那些将自己的状态设置为 unavailable 的用户自动答复收到的邮件,而且用户可以对定制自己的答复邮件。 这篇文章是探索 Java Apache Mail Enterprise Server,即James的第二部分。在这个系列的第一篇文章中,我们了解了James的基础设施和能力等基础知识,并且进行了在实验系统上安装James的整个过程。在这篇文章中,我们会在James基础设施上实现一个想法,开发一个支持用户账户的unavailable状态的应用程序。要使用我们的应用程序,用户需要发送指定类型的邮件到一个指定的邮件服务器地址,这个邮件被作为任何收到的邮件的自动答复消息,直到用户发送一个邮件撤销他的不可到达状态。这一机制与邮件客户端程序中常用的方法类似,向发件人发送一封邮件表示用户现在不在,因为去度假或者其它什么原因。但除非用户一直让客户端程序开着,否则这个功能没什么用。 通过使用服务器端解决方案,你可以在度假的时候用任何客户端软件登录服务器,在任何时候改变你的自动答复消息。
应用程序设计 在进行设计之前,我们应该清楚的说明需求。下面的几点将作为我们的例子设计的根据:
用户能够通过发送e-mail到 unavailable@emailserver to 来将他的账户切换到不可到达模式。发送到unavailable@emailserver的消息要存下来以备将来使用。 如果已经存在这个用户的不可到达消息,原来的消息将被新的覆盖,但用户会收到所发生的一切情况的通知。
用户能够通过发送e-mail 到 available@emailserver 来取消所有的不可到达消息。发送到 available@emailserver的消息会被丢弃并移走原来保存的不可到达消息 。用户应该收到账户状态已经变为可以到达的通知。
一个保存了不可到达消息的用户在任何时候收到的e-mail都应该用保存的消息自动回复,以向发件人说明用户当前处于不可到达的状态。触发这个操作的原始邮件应该进行正常的处理。 理解James基础设施 这个系列的第一篇 向你介绍了James的基础设施和它所具有的能力。
我用三段话来描述需求并不是偶然的。每个需求都直接对应着特定情形下的一组操作。每种情形都应该有相应的匹配器进行识别。( 参阅 第一篇 了解匹配器和mailet的详细信息) 例如,发送到特定地址的e-mail能用原有的RecipientIs匹配器进行匹配。但当我研究RecipientIs 的源代码时,我注意到它能处理任意数量的接收者,并且与其中任何一个接收者相匹配都被认为是匹配的。可能在大多数情况下,这样的处理很好,但这对于我们的应用而言是不幸的。我们的应用要求确保一个并且仅有一个特定地址包含在接收者中,所以我们要开发一个简单的匹配器来完成这个任务。我们将要开发的 MatchSingleRecipient 类还将向你展示如何让Matcher API发挥作用。
识别已经保存了准备用于处理的不可到达消息的接收者要稍微复杂一点儿。因此,我们要开发一个 MatchUnavailableUser 匹配器。 为了使匹配操作更有效,我们在测试不可到达目录中保存的文件之前先检查接收者是否是本地用户。另外,e-mail的处理也应该是相当简单的。接下来,我们先开发两个匹配器类,然后进行 mailet的开发。
我们对不可到达目录的使用相当多。实际上,需要对不可到达目录实现几个操作,包括检测消息是否存在、在该目录中保存、读取和删除消息。因为每个功能都需要知道保存消息的目录的地址和相关用户的一些信息,所以我们创建了一个独立的MatchUnavailableUser匹配器类来获取这些信息。我们设计的mailet实现类也用到了它。
我们要实现的匹配器几乎没有相同的地方,但处理我们提出的需求的mailet(每个需求都有一个mailet)都需要相似的配置信息和访问不可到达目录。所以我们用了一个每个mailet都能扩展的基类。除了提供基本的初始化代码,基类还是放置几个子类共用的应用方法的好地方。我们定义的基类是 UnavailableUserBase。
这三个应用功能将由我们的mailet类-- UnavailableMessageSave, UnavailableMessageDrop, 和 UnavailableMessageSend 来处理。前两个mailet功能相似,并且都是对一个接收者地址--可到达的和不可到达的--进行操作,所以它们共用了一些代码,这些共用的代码放在超类中。UnavailableMessageSend mailet是最复杂的一个,主要是因为它要处理多个接收者地址,还要给每个发送消息到不可到达的接收者的发件人发送消息。幸运的是,用Matcher 和 Mailet API 工作比较容易。
编写匹配器 基类 GenericMatcher简化了在James中编写匹配器的工作,大多数实现类都会扩展这个基类。我们的两个匹配器都扩展了这个类。首先,我们要在init() 方法中得到配置信息,然后在match()方法中执行处理动作。从技术上来讲,我们应该实现getMatcherInfo() 方法来报告卖主、版本等信息,但为了让这个例子中的代码更简练,我没有做这些事情。
在James的配置文件config.xml (我们已经在这个系列的第一篇中详细讨论了这个文件)中配置一个匹配器时,我们用一个XML 属性来说明它。匹配器的类名后跟着一个等号和一些文本信息;这些文本信息可以用getCondition() 方法获得。为了利用James提供的邮件地址比较代码,我们用getCondition() 方法返回的值创建了一个实例并把它保存到一个实例变量中。不用说,列表1中的MatchSingleRecipient 需要一个单独有效的本地e-mail地址作为它唯一的参数。
match() 方法得到被处理的e-mail接收者列表 。Mail 对象提供了几个有趣的方法。其中最常用的是getRecipients(),该方法返回一个包含了MailAddress 实例的 Java Collection 对象。为了看看我们是否有一个匹配的结果,首先要通过检查Collection 对象的大小来确信只有一个接收者,然后确保Collection (长度为1)对象包含的地址是我们在配置文件中说明的地址。
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一篇:James--编写一个定制的匹配器 下一篇:James -- 编写一个定制的Mailet
【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】
更多相关文章
|
|