У меня есть бот, который отвечает пользователям. Но иногда, когда мой бот отправляет свой ответ, пользователь или его провайдер электронной почты автоматически отвечают (сообщение об отпуске, сообщение об отказе, ошибка от mailer-daemon и т. Д.). Это новое сообщение от пользователя (так думает мой бот), на которое он, в свою очередь, отвечает. Почтовая петля!
Я бы хотел, чтобы мой бот отвечал только на реальные письма реальных людей. В настоящее время я отфильтровываю сообщение электронной почты, которое признается массовым приоритетом или из списка рассылки или имеет заголовок Auto-Submitted, равный «автоответчику» или «автоматически сгенерированному» (см. Код ниже). Но я думаю, что есть более полный или стандартный способ справиться с этим. (Я рад видеть решения на других языках, кроме Perl.)
NB. Не забудьте, что ваш собственный бот объявляет, что он автоматически отвечает! Включить
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
);
}
(Проверка «Тема» определенно не нужна; я просто добавлял эти проверки по одной, поскольку возникали проблемы, и вышеприведенное теперь, похоже, работает, поэтому я не хочу к нему прикасаться, если нет чего-то определенного лучше.)