9

ユーザーに返信するボットがあります。しかし、ボットが返信を送信すると、ユーザーまたはメール プロバイダーが自動応答することがあります (休暇メッセージ、バウンス メッセージ、メーラー デーモンからのエラーなど)。それはユーザーからの新しいメッセージであり (私のボットはそう考えています)、それに対して返信します。メールループ!

ボットが実際の人間からの実際のメールにのみ返信するようにしたいと考えています。私は現在、一括優先またはメーリング リストからの電子メール、または「自動返信」または「自動生成」に等しい自動送信ヘッダーを持つ電子メールを除外しています (以下のコードを参照)。しかし、これに対処するためのより包括的または標準的な方法があると思います。(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
          );
}

(Subject チェックは確かに不要です。問題が発生したときにこれらのチェックを 1 つずつ追加しただけで、上記は機能するようになったので、決定的に優れたものがない限り、触れたくありません。)

4

4 に答える 4

8

RFC 3834は、何をすべきかについてのガイダンスを提供しますが、ここにいくつかの具体的なガイドラインがあります。

エンベロープ送信者を自動応答者とは異なる電子メールアドレスに設定して、バウンスがシステムにフィードバックされないようにします。

私は常に、特定のアドレスから別のアドレスに電子メール応答が送信されたときのキーをデータベースに保存します。いかなる場合でも、同じアドレスに10分間に2回以上応答することはありません。これだけですべてのループが停止しましたが、適切な動作は保証されません(メーリングリストへの自動応答は煩わしいです)。

ループを停止するために、他の人が一致しているヘッダーの順列を追加してください。これが私が使用するリストです:


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) {
于 2009-11-30T00:26:54.977 に答える
2

おそらくCPANからモジュールとして入手できるもののように思えますが、5 分間の検索で明確に関連するものは見つかりませんでし たMail::Lite::Mbox::Processorは、あなたが望むことをするように見えます:

Mail::Lite::Message::Matcher は、自動メール処理のフレームワークです。たとえば、メール サーバーがあり、いくつかの種類の受信メール メッセージを自動的に処理する必要があるとします。たとえば、自動化された通知、請求書、アラートなどをメール フローから抽出し、それらのメッセージの内容に基づいていくつかのタスクを実行できます。

しかし、そのドキュメントは十分にまばらであるため、それらのサンプル関数自体が提供されているのか、それともそれらを駆動するコードを提供する必要があるのか​​はすぐにはわかりません。

いずれにせよ、CPAN をまだチェックしていない場合は、このようなことをしたい場合はそこから始めます。

于 2009-11-29T11:06:54.100 に答える
1

ここでの私の答えは、より簡単なバウンスのみを扱っています。

DSN(配信ステータス通知)識別子を使用すると、DSN/バウンスメッセージを検出するのに役立ちます。Reply-ToではなくReturn-Pathに移動する必要があります。

これは典型的なDSNメッセージのサンプルです。ヘッダー情報にはメッセージIDが含まれ、コンテンツタイプには特定の値(配信ステータス)などがあります。

perlでコードを提供することはできません。私の考えは2セントです。

PS:すべてのメールサーバーまたはMTAがこれに準拠しているわけではないことに注意してください。ただし、ほとんどの場合は準拠していると思います。

于 2009-11-29T03:28:03.473 に答える
1

これに対処する標準的な方法があるはずですが、問題は、自動応答を送信するシステムがその標準に準拠していると想定する必要があることです。ほとんどの場合、そうではありません。

返信先のアドレスを取得する方法を教えてください。From:ヘッダーを使用していないことを願っています。最初にヘッダーを確認し、Reply-to:それが存在しない場合は、Return-path:.

しかし、何をするにしても、誰に何を送信したかをログに記録し、ボットを 1 回あたりの適切なメッセージ数に制限する必要があります。

于 2009-11-29T12:38:05.130 に答える