ユーザーが自動応答に返信せず、メール ループに陥る電子メール ボットを作成する方法
-
06-07-2019 - |
質問
ユーザーに返信するボットがあります。ただし、ボットが応答を送信すると、ユーザーまたは電子メール プロバイダーが自動応答することがあります (休暇メッセージ、バウンス メッセージ、メーラー デーモンからのエラーなど)。それはユーザーからの新しいメッセージ (私のボットはそう考えます) であり、それに対して応答します。メールループ!
私のボットが実際の人間からの実際のメールにのみ返信するようにしたいと考えています。現在、一括優先であることを認める電子メール、メーリング リストからの電子メール、または「自動返信」または「自動生成」に等しい自動送信ヘッダーを持つ電子メールを除外しています (以下のコードを参照)。しかし、これに対処するためのより包括的または標準的な方法があると思います。(Perl 以外の言語でのソリューションを確認できるのは嬉しいです。)
注意:独自のボットに自動応答することを宣言させることを忘れないでください。含む
Auto-Submitted: auto-reply
ボットの電子メールのヘッダーに。
メールループを回避するための私のオリジナルのコードは次のとおりです。realmail が true を返した場合にのみ応答します。
sub realmail {
my($email) = @_;
$email =~ /\nSubject\:\s*([^\n]*)\n/s;
my $subject = $1;
$email =~ /\nPrecedence\:\s*([^\n]*)\n/s;
my $precedence = $1;
$email =~ /\nAuto-Submitted\:\s*([^\n]*)\n/s;
my $autosub = $1;
return !($precedence =~ /bulk|list|junk/i ||
$autosub =~ /(auto\-replied|auto\-generated)/i ||
$subject =~ /^undelivered mail returned to sender$/i
);
}
(件名チェックは確かに不要です。問題が発生したときにこれらのチェックを 1 つずつ追加しただけで、現在は上記の機能が動作しているように見えるため、決定的に優れたものがない限り、これには触れたくないです)。
解決
RFC 3834は、何をすべきかについてのガイダンスを提供していますが、具体的なガイドラインを次に示します。
バウンスがシステムにフィードバックされないように、エンベロープ送信者を自動応答者とは異なるメールアドレスに設定します。
特定のアドレスから別のアドレスに電子メールの応答が送信されたときのキーを常にデータベースに保存します。いかなる状況でも、同じアドレスに10分間に複数回応答することはありません。これだけですべてのループが停止しましたが、素晴らしい動作は保証されません(メーリングリストへの自動応答は迷惑です)。
ループを停止するために、他の人が一致しているヘッダーの順列を必ず追加してください。使用するリストは次のとおりです。
X-Loop: autoresponder
Auto-Submitted: auto-replied
Precedence: bulk (autoreply)
ここに、ループを回避し、うまく再生しようとするために使用するヘッダーの正規表現を示します。
/^precedence:\s+(?:bulk|list|junk)/i
/^X-(?:Loop|Mailing-List|BeenThere|Mailman)/i
/^List-/i
/^Auto-Submitted:/i
/^Resent-/i
また、これらのいずれかがエンベロープ送信者である場合、応答を避けます:
if ($sender eq ""
|| $sender =~ /^(?:request|owner|admin|bounce|bounces)-|-(?:request|owner|admin|bounce|bounces)\@|^(?:mailer-daemon|postmaster|daemon|majordomo|ma
ilman|bounce)\@|(?:listserv|listsrv)/i) {
他のヒント
それ 本当に おそらくモジュールとして入手できるもののようです CPAN, しかし、5分間検索しても明確に関連するものは見つかりませんでした。 Mail::Lite::Mbox::プロセッサ それはあなたが望むことを行うかもしれないように見えます:
メール:: Lite :: Message :: Matcherは、自動メール処理のフレームワークです。たとえば、メールサーバーがあり、ある種の着信メールメッセージを自動的に処理する必要があります。たとえば、自動化された通知、請求書、アラートなどを抽出できます。メールフローから、これらのメッセージのコンテンツに基づいていくつかのタスクを実行します。
しかし、そのドキュメントは非常にまばらであるため、これらのサンプル関数自体が提供されているのか、それともそれらを駆動するコードを提供する必要があるのかがすぐにはわかりません。
ただし、いずれにせよ、まだ CPAN をチェックしていない場合は、このようなことを行う場合は、そこから始めることになります。
ここでの私の答えは、より簡単なバウンスのみを扱っています。
DSN(配信ステータス通知)識別子を使用すると、DSN /バウンスメッセージの検出に役立ちます。 Reply-ToではなくReturn-Pathに移動する必要があります。
典型的な DSNメッセージのサンプルです。ヘッダー情報にはメッセージID、コンテンツタイプには特定の値(配信ステータス)などが含まれます。
Perlでコードを提供することはできません。2セントのアイデアです。
PS:すべてのメールサーバーまたは MTA がこれに準拠しているわけではありませんが、ほとんどがそうだと思います。
これに対処する標準的な方法があるはずですが、問題は、自動応答を送信するシステムがその標準に準拠していると仮定しなければならないことです。ほとんどの場合、そうではありません。
返信先のアドレスをどのように取得しますか? From:
ヘッダーを使用していないことを願っています。最初に Reply-to:
ヘッダーを確認し、存在しない場合は Return-path:
を使用します。
しかし、あなたが何をするにしても、誰に送信したかをログに記録し、ボットを時間ごとのメッセージの適切な値に絞る必要があります。