私は専門の管理者ではないので、ご容赦ください
数年前から稼働しているLinuxメールサーバーがありますが、突然、特定のユーザーがメールを送信できなくなりました。彼らはすぐに「システム管理者」から次のような応答を受け取ります
501 5.5.4 error bad notify parameter syntax
これは、このユーザーとそのコンピューターでのみ発生します。 Thunderbirdでは正常に動作しますが、Outlook2013では動作しません。他のユーザーはOutlook2013を問題なく使用できます。
私はログを見ました、そしてこれはこのユーザーが電子メールを送ろうとしたときにそれが言うことです
replacing command "RCPT TO: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY" with "RCPT TO: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY NOTIFY=NEVER"
ヘッダーの追加、電子メールウイルススキャナーの無効化、アカウントの再追加などのOutlookルールを確認しました。
私は読んでいますが、NOTIFY = NEVERを他のNOTIFYコマンドと混在させることはできないようです
smtpd_command_filter このような設定があります
/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/ $1 NOTIFY=NEVER
私は正規表現が苦手ですが、元のコマンドを正しく解析しておらず、置換する代わりに最後にNOTIFY = NEVERを追加していると思います。
それまでの間、「メッセージが正常に配信されました」という通知を送信者に送信するコメントを送信しました。私は追加することによってそれを沈黙させました
smtpd_discard_ehlo_keywords = silent-discard, dsn
main.cfへ
新しい設定は問題ありませんか、それとも正規表現にあると推測される元の問題を修正する必要がありますか?何か案は?
私は読んでいますが、NOTIFY = NEVERを他のNOTIFYコマンドと混在させることはできないようです
参考までに、 RFC 1891 セクション5.1で定義されています。
クライアントによって発行されたRCPTコマンドには、SMTPサーバーがその受信者のDSNを生成する条件を指定するために、オプションのesmtp-keyword "NOTIFY"が含まれている場合があります。 NOTIFY esmtp-keywordを使用する場合は、RFC 822のABNFを使用して、次のルールに従ってフォーマットされたesmtp-valueを関連付ける必要があります。
notify-esmtp-value = "NEVER" / 1#notify-list-element notify-list-element = "SUCCESS" / "FAILURE" / "DELAY"
ノート:
a。コンマで区切られた複数のnotify-list-elementsは、NOTIFYパラメーターに表示される場合があります。ただし、NEVERキーワードは単独で表示する必要があります。
b。キーワードNEVER、SUCCESS、FAILURE、またはDELAYは、大文字と小文字の任意の組み合わせで綴ることができます。
これはあなたの正規表現です( このページ からコピーされたように見えます)
/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/ $1 NOTIFY=NEVER
これは、Outlook2013のRCPTコマンド文字列です。
RCPT TO: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY
上記の文字列は2行目に一致します。 なぜですか?TO:
と<[email protected]>
の間に空白があるため、正規表現の最初の行には、TO:
と '<`の間に空白が含まれていません。
':'と '<'の問題の間のスペースについては、ここで RFC 5321
これはエラーの一般的な原因であるため、MAILコマンドのFROMまたはRCPTコマンドのTOに続くコロンの両側にスペースが許可されていないことに注意してください。構文は上記のとおりです。
したがって、問題がローカルに発生するのはそのためです。 Outlookはまだスペースを追加していますRCPT TO:
の後の間にあるため、RFC仕様に違反しているようです。
正規表現ソリューション:
正規表現の最初の行を変更して、これになります
/^(RCPT\s+TO:\s*<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
\ s *を追加すると、RCPT TO:
の後に空白が0個以上ある文字列に一致します。
正規表現の仕組みの説明については、 このページ にアクセスしてください。