如何使回复用户的电子邮件机器人不回复自动响应并使自己进入邮件循环

时间:2009-11-29 03:15:11

标签: perl email bots auto-responder

我有一个回复用户的机器人。但有时当我的机器人发送回复时,用户或他们的电子邮件提供商将自动响应(休假消息,退回消息,来自邮件程序守护程序的错误等)。然后,这是来自用户的新消息(因此我的机器人认为)它反过来回复。邮件循环!

我希望我的机器人只回复来自真实人类的真实电子邮件。我目前正在过滤掉承认批量优先权的邮件或邮件列表,或者自动提交的标题等于“自动回复”或“自动生成”(请参阅​​下面的代码)。但我想有一个更全面或标准的方法来处理这个问题。 (除了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
          );
}

(主题检查肯定是没有必要的;我只是在出现问题时一次添加一个这些检查,上面现在似乎有效,所以我不想触摸它,除非有明确的更好的东西。)

4 个答案:

答案 0 :(得分:8)

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) {

答案 1 :(得分:2)

真的听起来像CPAN中可能作为模块提供的东西,但我在五分钟的搜索中没有发现任何明显相关的东西。 Mail::Lite::Mbox::Processor看起来可能会做你想做的事情:

  

Mail :: Lite :: Message :: Matcher是一个   自动邮件的框架   处理。例如,你有一个   邮件服务器,你需要   处理某些类型的传入邮件   消息自动。例如,   你可以提取自动化   通知,发票,提醒等   从你的邮件流和执行一些   任务基于那些内容   消息。

但它的文档非常稀疏,以至于它是否提供这些示例函数本身或者是否必须提供驱动它们的代码并不是很明显。

无论如何,如果你还没有检查过CPAN,那么如果我想做这样的事情就是我要去的地方。

答案 2 :(得分:1)

我在这里的答案仅涉及更为直接的反弹。

使用DSN (Delivery Status Notification)标识符可帮助您检测DSN /退回邮件。它应该转到Return-Path而不是Reply-To。

以下是典型DSN message的示例。标题信息包括消息ID,内容类型具有特定值(传递状态)等。

无法为您提供perl中的任何代码,只需要我2美分的想法。

PS:请注意并非所有邮件服务器或MTA都符合此要求,但我猜大多数都是。

答案 3 :(得分:1)

应该有一种标准的方法来解决这个问题,但问题是你必须假设发送自动回复的系统符合该标准,大多数时候,他们只是没有。

您如何获得回复的地址?我希望你没有使用From:标题。首先检查Reply-to:标题,如果不存在,请使用Return-path:

但无论你做什么,你只需要记录你发送给谁的内容,并将你的僵尸程序限制为每次消息的合理价值。