Sun Java System Messaging Server 6 2005Q4 管理指南

调试用户级别的过滤器

如果用户抱怨 Sieve 过滤器未按预期运行,则您可以采取一系列步骤来调试过滤器。下面对这些步骤进行了介绍。

Procedure调试用户级别的过滤器

步骤
  1. 要使 fileinto 过滤能够正常工作,请在 imta.cnf 文件中查看 ims-ms 通道是否标记如下:

    fileinto $u+$s@$d

  2. 从用户 LDAP 条目中获取用户级别的过滤器。

    用户级别的过滤器存储在 MailSieveRuleSource 属性下的 LDAP 条目中。要使用 ldapsearch 命令检索此过滤器,请记住它们是以 base64 编码的,因此您需要使用 -Bo 切换对输出进行解码。


    ./ldapsearch -D "cn=directory manager" -w password -b 
    "o=alcatraz.sesta.com,o=isp" -Bo uid=test

    下述 imsimta test -rewrite 命令也将自动对它们进行解码。

  3. 验证 MTA 是否可以看到用户过滤器。

    发出命令:

    # imsimta test -rewrite -filter -debug user@sesta.com

    此命令应该输出您在前面步骤中检索的用户 Sieve 过滤器。如果未看见过滤器,则需要指出为什么 LDAP 条目未返回这些过滤器。如果 imsimta test -rewrite 输出显示过滤器,则表明 MTA 可看到用户过滤器。下一步将使用 imsimta test -expression 命令测试过滤器的解释。

  4. 使用 imsimta test -exp 调试用户过滤器。需要以下信息:

    1. mailSieveRuleSource 属性中的用户 Sieve 语言语句。请参见以上步骤。

    2. 触发过滤器的 rfc2822 邮件。

    3. 描述过滤器应对邮件进行什么操作。

  5. 创建文本文件(例如:temp.filter),该文本文件包含基于用户 mailSieveRuleSource: values 的 Sieve 语言语句。示例:

    require "fileinto";
    if anyof(header :contains
    ["To","Cc","Bcc","Resent-to","Resent-cc", 
       "Resent-bcc"] "commsqa"){ 
       fileinto "QMSG";
    }

    预期结果:如果 commsqa 是此邮件的收件人,则将邮件归档到名为 QMSG 的文件夹中。

  6. 创建名为 test.msg 的文本文件,该文件包含用户提供的 rfc2822 邮件文件的内容。

    您可以使用用户邮件存储区域中的 .msg 文件,也可以创建名为 test_rfc2822.msg 的文本文件,该文件包含用户提供的 rfc2822 邮件文件的内容。

  7. 使用 imsimta test -exp 命令:


    # imsimta test -exp -mm -block -input=temp.filter -message=test_rfc2822.msg
    
  8. 检查输出。

    imsimta test -exp 命令的最后几行将显示 Sieve 解释的结果。结果类似于:


    Sieve Result: [] 
    or this: 
    Sieve Result: [action]
    

    其中,action 是在此邮件上应用 Sieve 过滤器后要执行的操作。

    如果过滤器的条件匹配,则会得到显示为结果的某个操作。如果没有匹配项,Sieve 结果将为空白,原因是 Sieve 过滤器中存在逻辑错误或 .msg 文件不包含匹配信息。如果收到任何其他错误,则 Sieve 脚本文件中存在语法错误,您需要对其进行调试。

    有关输出的更多信息,请参见imsimta test -exp 输出

  9. 如果过滤器在语法上有效并且结果正确,则下一步将检查 tcp_local_slave.log 调试日志文件。

    可能会出现正在测试的邮件文件与正在发送的邮件文件不相同的情况。查看正在接收的内容的唯一方法是:检查 tcp_local_slave.log 文件。此日志将向您显示正在发送到 MTA 的实际邮件以及如何将过滤器应用到该邮件。

    有关获取 tcp_local_slave.log 调试文件的更多信息,请参见调试关键字中的 slave_debug 关键字。

imsimta test -exp 输出

完整的 imsimta test -exp 命令如下:

# imsimta test -exp -mm -block -input=temp.filter -message=rfc2822.msg

下面是一个输出示例:


示例 17–4 imsimta test -exp 输出


# imsimta test -exp -mm -block -input tmp.filter -message=rfc2822.msg
Expression: if header :contains ["to"] ["pamw"]       (1)
Expression: {
Expression: redirect "usr3@sesta.com";
Expression: keep;
Expression: }
Expression:
Expression: Dump: header:2000114;0  3  1  :contains  1  "to"  1
"pamw"  if  8  ;
Dump: redirect:2000121;0  1  1  "usr3@sesta.com"  ;  keep:2000117;0 (2)
Dump: 0
Result: 0
Filter result: [ redirect "usr3@sesta.com" keep ]    (3)
            

1) Expression: 输出行显示正在从 tmp.filter 文本文件中读取并解析的过滤器。这些在调试脚本中不是特别有用。

2) Dump: 输出行是计算机解释 Sieve 语句的结果。不应看到有任何错误,并且输出看起来应与输入相匹配。例如 Dump 显示了文字 redirect, usr3@sesta.com,这与过滤器文件中的行 redirect "usr3@sesta.com"; 类似。

如果未显示此匹配文本,则应当引起注意,否则,它们在调试脚本时也不是特别有用。

3) 在输出的底部,您将看到 Filter result: 语句。如前面所述,可能有两种结果:

Sieve Result: [] 或:Sieve Result: [action]

其中 action 是 Sieve 脚本执行的操作。请注意,有时预期的结果为空。例如,对于 discard 过滤器,您应当测试该过滤器并不总是放弃测试的每个 .msg 文件。如果在方括号间存在某个操作,例如:

Filter result: [fileinto "QMSG" keep]

这表明 rfc2822.msg 文件中的文本与过滤器条件匹配。在此特定示例中,过滤器将把邮件归档到 QMSG 文件夹中,并在收件箱中保存一份副本。本示例中的结果操作是 fileintokeep

测试过滤器时,应当测试两种结果的各个 .msg 文件。应始终测试是否已过滤匹配过滤器的邮件,并测试是否未过滤不想匹配的邮件。

请记住,对于通配符匹配,您必须使用 :matches 测试而不是使用 :contains。例如,如果要匹配 from=*@sesta.com,则必须使用 :matches,否则测试会由于不满足测试条件而失败。

imsimta test -exp 语法

imsimta test -exp 将针对指定的 RFC2822 邮件测试 Sieve 语言语句,并将过滤器的结果发送到标准输出。

语法如下:

imsimta test -exp -mm -block -input=Sieve_language_scriptfile -message=rfc2822_message_file

其中,

-block 将整个输入视为一个 Sieve 脚本。默认情况下,将每行作为一个单独的脚本,并分别对其进行评估。仅在到达文件末端时评估 Sieve。

-input=Sieve_file 是包含 Sieve 脚本的文件。默认情况下,将从 stdin 中读取测试脚本行或脚本块。

-message=message_file 是一个文本文件,该文件包含要针对其测试 Sieve 脚本的 RFC 2822 邮件。这只能是 RFC 2822 邮件。而不能是队列文件(不是 zz*.00 文件)。

激活后,此命令将读取脚本信息,在测试邮件的上下文中评估该信息,并写出结果。结果显示将进行什么操作以及脚本中最终语句的评估结果。

其他有用的限定符包括:

-from=address 指定要在信封测试中使用的信封 from: 地址。默认情况下,使用由 RETURN_ADDRESS MTA 选项指定的值。

-output=file 将结果写入 file。默认情况下,将脚本测试结果写入 stdout 中。