我有一个回复用户的机器人.但有时当我的机器人发送回复时,用户或他们的电子邮件提供商将自动响应(休假消息,退回消息,来自邮件程序守护程序的错误等).然后,这是来自用户的新消息(因此我的机器人认为)它反过来回复.邮件循环!
我希望我的机器人只回复来自真实人类的真实电子邮件.我目前正在过滤掉承认批量优先权的邮件或邮件列表,或者自动提交的标题等于"自动回复"或"自动生成"(请参阅下面的代码).但我想有一个更全面或标准的方法来处理这个问题.(除了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 ); }
(主题检查肯定是没有必要的;我只是在出现问题时一次添加一个这些检查,上面现在似乎有效,所以我不想触摸它,除非有明确的更好的东西.)
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) {