Sun Java System Messaging Server 6.3 管理指南

14.8 使用 Milter

本节包含以下几个部分:14.8 使用 Milter

14.8.1 Milter 概述

Milter 是 Sendmail Content Management API 的简称。它还表示使用此 API 编写的软件。Milter 为第三方软件提供插件接口,以便在邮件通过 MTA 时验证、修改或阻止邮件。Milter 可以处理邮件的连接 (IP) 信息、信封协议元素、邮件标题和/或邮件正文内容,并且可以修改邮件的收件人、标题和正文。在垃圾邮件拒绝、病毒过滤和内容控制等过程中可能会用到过滤器。通常,Milter 尝试以可伸缩的方式来解决站点范围内的过滤问题。Milter 最初是为 sendmail 设计的,为 sendmail 编写的 Milter 现在可以与 Messaging Server 一起使用,但是会有一些限制(请参见下面的内容)。有关 Milter 的更多信息,请参阅 Internet。

14.8.2 Milter/Messaging Server 操作原理

Milter 控制对邮件执行的操作。Messaging Server 使用14.2.2 指定要过滤的邮件中所述的方法,控制 Milter 要对哪些邮件执行操作。

在 sendmail 中,Milter 由 sendmail 自身的支持代码和一个单独的 libmilter 库组成。过滤器编写者将其过滤器链接到 libmilter 以产生一个服务器。然后配置 Sendmail 以使其连接到这些 Milter 服务器。

Messaging Server 提供一个库,可模仿 Milter 接口的 sendmail 端。这使得为 sendmail 编写的 Milter 可以与 Messaging Server 一起使用。

以下是几点注意事项。Milter 协议由文本和二进制元素混合组成,且未妥善记录。另外,Milter 语义与 sendmail 处理邮件的方式紧密联系在一起。尤其是,Milter 可以并且通常会访问 sendmail 配置中所定义的宏的子集。Messaging Server 的 Milter 客户端库尝试提供一个合理的 sendmail 宏集,但完全可以根据当前未实现的 sendmail 配置的特定方面来编写 Milter。最终结果是,从网络获取的任意 Milter 不一定能与此客户端库结合使用。如果问题严重,我们将尝试解决,但不能保证每个 Milter 都会成功。

14.8.3 Milter 要求和使用注意事项

Milter 服务器可以在其自己的单独系统上、单一系统部署中与 Messaging Server 相同的系统上或两层部署中与 MTA 相同的系统上运行。如果在 MTA 和消息存储之间使用 LMTP,则必须从 MTA 中调用过滤,而不能从消息存储中调用过滤。如果在 MTA 和消息存储之间使用 SMTP,则既可以从 MTA 也可以从消息存储中调用过滤,并且 Milter 服务器可以在上述系统或单独的第三方系统中运行。

Messaging Server 支持连接到多个 Milter 服务器。如果您指定的域名转换为多个 IP 地址,系统将按照从 DNS 接收的顺序尝试所有地址,直到其中一个地址有效为止。某些 DNS 服务器允许按任意顺序返回地址,从而提供了基本的负载平衡/故障转移功能。

14.8.3.1 支持的 Milter 邮件修改操作

Milter 接口当前支持添加标题 ( SMFIF_ADDHDRS)、更改或删除标题 (SMFIF_CHGHDRS) 以及隔离邮件 (SMFIF_QUARANTINE) 功能。目前不支持更改邮件正文 (SMFIF_CHGBODY)、添加收件人 (SMFIF_ADDRCPT) 和删除收件人 (SMFIF_DELRCPT) 功能。

14.8.3.2 Milter 接口提供的宏

以下是 Milter 接口当前定义的宏:

$j 置于 Received: 标题字段 by 子句中的文本。在 Messaging Server 中,此宏由 MTA 选项 RECEIVED_DOMAIN 控制。如果未设置此选项,则使用 local 通道上的正式主机。

${client_addr} SMTP 客户端的 IP 地址,使用以点分隔的四组数值表示。仅在通过 TCP 使用 SMTP 时设置。

$i 当前邮件的队列 ID。Messaging Server 为每个会话生成一个唯一 ID;此 ID 即为 $i 宏中显示的内容。

${mail_addr} 当前事务的 MAIL FROM 地址。

${mail_host} 当前事务的 MAIL FROM 地址的主机部分。

${rcpt_addr} 当前事务的 RCPT TO 地址。

${rcpt_host} 当前 RCPT TO 地址的主机部分。

Procedure部署 Milter

可执行以下步骤来部署 Milter:

  1. 获取并配置将执行所需操作的 Milter。

    有关获取和配置信息,请参阅具体的 Milter 文档。

  2. 装入并配置 Milter 客户端库。(请参见14.2.1 装入和配置垃圾邮件过滤软件客户端库。)

    1. 指定客户端库的路径 libmilter.so。指定 Milter 配置文件的路径和名称。

      示例:


      spamfilter1_library=/opt/SUNWmsgsr/lib/libmilter.so
      spamfilterX_config_file=/opt/SUNWmsgsr/lib/milter.opt
    2. 使用所需的选项创建 Milter 配置文件。

      Milter 选项文件由多个 option=value 格式的行组成。必须设置的两个选项为 HOSTPORTHOST 必须设置为运行 Milter 服务器的系统的名称,而 PORT 必须设置为配置 Milter 服务器侦听的端口。请注意,仅支持 TCP/IP 连接;不能指定或使用 UNIX 域套接字。

      此选项文件中还有几个其他选项:

      DEBUG(整数,默认值为 0)— 启用或禁用 Milter 客户端库的调试输出。值越大,生成的调试输出越多。0 不生成任何输出。1 提供基本调试。2 增加了 TCP 通信的日志记录。(Milter 服务器的调试输出通常由命令行上用于启动服务器的设置控制。请注意,大部分 Milter 似乎只提供将调试输出直接传送到系统日志的功能。)

      TIMEOUT(整数,默认值为 3600)— 指定与 Milter 连接有关的操作的超时时间(以百分之一秒为单位)。此选项适用于 6.3 和更高版本。

      SOCKS_HOST(字符串,默认值为 "")— 指定中间 SOCKS 服务器的名称。如果指定了此选项,则间接通过指定的 SOCKS 服务器建立 Milter 连接。

      SOCKS_PORT(整数,默认值为 1080)— 指定运行中间 SOCKS 服务器的端口。

      SOCKS_PASSWORD(字符串,默认值为 "")— 指定通过 SOCKS 服务器建立连接所使用的密码。是否需要用户名/密码取决于 SOCKS 服务器配置。

      SOCKS_USERNAME(字符串,默认值为 "")— 指定通过 SOCKS 服务器建立连接所使用的用户名。

  3. 指定发送到 Milter 的邮件。

    用户、域或通道均可以过滤邮件。请参见14.2.2 指定要过滤的邮件

  4. option.dat 文件中设置 spamfilterX_string_action 选项:

    spamfilterX_string_action=data:,$M

    此设置可以无条件使用,但只有在 Milter 的 MTA 选项文件中才能正常工作。