ユーザーから Sieve フィルタが期待通りに動作しないという苦情が寄せられた場合、フィルタをデバッグするために実行できるいくつかの手順があります。これらの手順を次に示します。
fileinto フィルタリングを動作させるために、imta.cnf ファイル内の ims-ms チャネルが次のようにマークされていることを確認します。
fileinto $U+$S@$D
ユーザーの LDAP エントリからユーザーレベルのフィルタを取得します。
ユーザーレベルのフィルタは、MailSieveRuleSource 属性の下のそれぞれの LDAP エントリに保存されています。ldapsearch コマンドを使用してこのフィルタを検索する際には、これらが base64 でエンコードされているため -Bo スイッチで出力をデコードする必要があることに注意してください。
./ldapsearch -D "cn=directory manager" -w password -b "o=alcatraz.sesta.com,o=isp" -Bo uid=test |
ユーザーのフィルタが MTA から見えることを確認します。
次のコマンドを発行します。
# imsimta test -rewrite -filter -debug user@sesta.com
これにより、前の手順で取得したユーザーの Sieve フィルタが出力されます。フィルタが見つからない場合は、LDAP エントリがそれらを返さない理由を調べる必要があります。imsimta test -rewrite の出力にフィルタが表示されていたら、ユーザーのフィルタが MTA から見えているということです。次に必要な処理は、imsimta test -expression コマンドを使用してフィルタの解釈をテストすることです。
テキストファイルを作成します (temp.filter など)。このファイルには、ユーザーの mailSieveRuleSource: の値に基づいた Sieve 言語ステートメントを格納します。次にその例を示します。
require "fileinto"; if anyof(header :contains ["To","Cc","Bcc","Resent-to","Resent-cc", "Resent-bcc"] "commsqa"){ fileinto "QMSG"; }
期待される結果: commsqa がこのメッセージの受取人である場合は、メッセージを QMSG というフォルダにファイリングします。
ユーザーによって指定される rfc2822 メッセージファイルの内容を含む、test.msg という名前のテキストファイルを作成します。
ユーザーのメッセージストア領域から .msg ファイルを使用するか、あるいはユーザーによって指定される rfc2822 メッセージファイルの内容を含む test_rfc2822.msg というテキストファイルを作成することができます。
imsimta test -exp コマンドを使用します。
# imsimta test -exp -mm -block -input=temp.filter -message=test_rfc2822.msg |
この出力を確認します。
imsimta test -exp コマンドの最後の行は、Sieve 解釈の結果を示します。結果は次のようになります。
Sieve Result: [] または Sieve Result: [action] |
action は、Sieve フィルタを適用した結果としてこのメッセージに実行されたアクションです。
フィルタの条件に一致した場合、結果としていくつかのアクションが表示されます。一致するものがない場合、Sieve 結果は空白となり、Sieve フィルタに論理上のエラーがあるか、または .msg ファイルに一致する情報が含まれていないかのどちらかです。ほかのエラーが発生している場合は、Sieve スクリプトファイルに構文エラーがあるので、デバッグする必要があります。
出力の詳細については、「18.15.1 imsimta test -exp Output」を参照してください。
フィルタが構文的に有効で結果が正しい場合、次に必要な処理は tcp_local_slave.log デバッグログファイルを調べることです。
テストしたメッセージファイルと送信されているメッセージファイルが同一でない可能性があります。受信しているメッセージを確認する唯一の方法は、tcp_local_slave.log ファイルを調べることです。このログには、MTA に送信されている正確なメッセージと、メッセージに対してフィルタがどのように適用されているかが表示されます。
tcp_local_slave.log デバッグファイルの入手の詳細については、「12.11.2 デバッグのキーワード」の slave_debug キーワードを参照してください。
imsimta test -exp の完全なコマンドは、次のとおりです。
# imsimta test -exp -mm -block -input=temp.filter -message=rfc2822.msg
出力の例を次に示します。
# 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 ステートメントを解釈しているコンピュータの結果を示します。ここにエラーが表示されないようにしてください。出力は入力と一致しているように見えなければなりません。たとえば、ダンプには、フィルタファイル内の行 redirect "usr3@sesta.com"; とよく似た redirect, usr3@sesta.com という語が表示されます。
このように一致するテキストが表示されない場合は調べてみる必要があります。表示された場合、これらもスクリプトのデバッグとはあまり関係がありません。
3) 出力の一番下の行に、Filter result: ステートメントが表示されます。前述したように、次の 2 とおりの結果が考えられます。
Sieve Result: [] または Sieve Result: [action]
action は、Sieve スクリプトによって実行されるアクションです。結果が空白になる場合もあるので注意してください。たとえば、破棄フィルタの場合、そのフィルタが常に、テストの対象となるすべての .msg ファイルを破棄しているのではないことをテストする必要があります。角括弧の間に何らかのアクションが含まれる場合、次のようになります。
Filter result: [ fileinto "QMSG" keep]
これは、rfc2822.msg ファイルのテキストがフィルタ条件に一致していることを示しています。この例では、フィルタはメールを QMSG フォルダにファイリングして、コピーを受信箱に保存します。この場合、結果として実行されるアクションは、fileinto および keep です。
フィルタをテストする際には、両方の結果について、各種の .msg ファイルをテストする必要があります。常に、使用するフィルタに一致するメッセージがフィルタ処理されていること、また、一致させたくないメッセージがフィルタ処理されていないことをテストする必要があります。
ワイルドカードとの照合の場合は、:contains テストではなく :matches テストを行う必要があることを理解しておいてください。たとえば、from=*@sesta.com と一致させる場合は :matches を使用してください。そうしないと、テストの条件が満たされないためテストは失敗します。
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: アドレスを指定します。デフォルトでは、MTA オプション RETURN_ADDRESS によって指定された値が使用されます。
-output=file は、結果を file に書き込みます。デフォルトでは、スクリプトの評価結果が stdout に書き込まれます。