我有一个回复用户的机器人。但有时,当我的机器人发送回复时,用户或他们的电子邮件提供商将自动响应(假期消息、退回消息、来自邮件守护进程的错误等)。这就是来自用户的一条新消息(我的机器人就是这么认为的),然后它又回复了它。邮件循环!
我希望我的机器人只回复来自真实人类的真实电子邮件。我目前正在过滤那些承认是批量优先或来自邮件列表的电子邮件,或者自动提交的标题等于“自动回复”或“自动生成”的邮件(参见下面的代码)。但我想有一种更全面或更标准的方法来处理这个问题。(我很高兴看到除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
);
}(主题检查肯定是不必要的;当出现问题时,我只是一次添加一个检查,上面的检查现在似乎有效,所以我不想接触它,除非确实有更好的东西。)
发布于 2009-11-30 08:26:55
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) {发布于 2009-11-29 19:06:54
这听起来确实像是CPAN提供的一个模块,但我在五分钟的搜索中没有找到任何明确相关的东西。Mail::Lite::Mbox::Processor看起来可以做你想做的事情:
邮件::Lite::Message::Matcher是一个自动化邮件处理框架。例如,您有一台邮件服务器,并且需要自动处理某些类型的传入邮件消息。例如,您可以从邮件流中提取自动通知、发票、警报等,并根据这些消息的内容执行一些任务。
但它的文档足够稀疏,以至于不能立即确定是它自己提供了这些示例函数,还是您必须提供代码来驱动它们。
但是,在任何情况下,如果您还没有检查过CPAN,那么如果我想做这样的事情,我会从CPAN开始。
发布于 2009-11-29 11:28:03
我在这里的答案只涉及反弹,这是更直接的。
使用DSN (Delivery Status Notification)标识符将帮助您检测DSN/退回邮件。它应该转到返回路径,而不是回复。
下面是一个典型的DSN message示例。报头信息包括消息id、内容类型具有特定值(传送状态)等。
我不能用perl给你提供任何代码,这只是我的2分钱的想法。
PS:请注意,并不是所有的邮件服务器或MTA都符合这一点,但我猜大多数都符合。
https://stackoverflow.com/questions/1814528
复制相似问题