SpoolManager、匹配器和Mailets
James将发送邮件到James的服务(比如SMTP、FetchPOP)和James收到邮件后进行处理的引擎区分开。 SpooleManager组件就是James的邮件处理引擎,它是一个Mailet容器,正是这些mailet和匹配器执行真正的邮件处理任务。
SpoolManager运转的关键是匹配器和Mailet。匹配器是一种检查邮件消息是非符合某一特定条件的简单对象。 Mailet是另一种类型的对象,它以某种方式处理email消息。某些适合于mailet的典型任务可能是给邮件消息添加一个头、将消息存放到本地的存储介质中,或者处理一个远程的发送。匹配器和Mailet API都是public的,允许James用户编写自己的匹配器和mailet。James带有大量已经建好的匹配器和mailet。
匹配器和mailet是成对使用的。在处理消息的每个阶段匹配器都会进行检查,匹配器会尝试着与邮件消息进行匹配,匹配结果并不是简单的是或否,match方法会返回一个相匹配的接收者的集合。如果这个相匹配的接收者的集合为空,就不会激活mailet。如果这个集合包含所有的原始接收者,邮件就会由相关联的mailet进行处理。最后,如果这个集合是原始接收者集合的一个子集,这个消息会被复制,相匹配的接收者的邮件会由mailet进行处理。其它的接收者的邮件会被设置为非匹配接收者,并且不会有mailet对邮件进行处理。
更多关于匹配器和mailets的信息可以在这里找到。
匹配器和mailet的上一层是处理器,每个处理器都包含了一个匹配器/mailet对的列表。在处理邮件的过程中,会由每一对匹配器和mailet按顺序进行处理。大多数情况下,消息都会被处理器中所有的匹配器/mailet对处理。然而,也有可能某个mailet改变了消息的状态使的消息会马上转给其它的处理器,而且当前的处理器不再对邮件进行任何处理。典型的情况是mailet想要阻止任何对该邮件的进一步处理(比如邮件已经被保存到本地,因此不再需要进行任何处理)或者邮件已经被标识为应该由某个特殊的处理器处理(比如是一个垃圾邮件,因此应该被转入垃圾邮件处理器)。因为存在这种转发,所以SpoolManager中的处理器是树的形式。必须存在一个树的根节点,也就是根处理器。
SpoolManager持续不断的检查缓冲池中的邮件,当第一次发现一个邮件时,它会被交给根处理器。邮件可以通过几个途径进入缓冲池(SMTP、FetchPOP和用户自己的组件)。缓冲池还用来存储从一个处理器转发给另一个处理器的邮件。邮件在到达一个处理器的终点或者被mailet标记为处理结束之前会一直在处理树中运转。
关于SpoolManager配置的信息可以在这里找到。
SpoolManager组件为James提供了巨大的潜力,很容易开发定制的匹配器和mailet来满足系统管理员特殊的需要。还可以通过配置处理树轻松的实现依据任意数量的标准进行邮件的排序、过滤和发送。刚刚接触James的邮件系统管理员应该花些时间研究一下如何通过配置SpoolManager来满足自己的需要。,