Как создать почтового бота, который отвечает пользователям, не отвечает на авто-ответы и попадает в почтовые циклы

StackOverflow https://stackoverflow.com/questions/1814528

Вопрос

У меня есть бот, который отвечает пользователям. Но иногда, когда мой бот отправляет свой ответ, пользователь или его провайдер электронной почты автоматически отвечают (сообщение об отпуске, сообщение об отказе, ошибка от mailer-daemon и т. Д.). Это новое сообщение от пользователя (так думает мой бот), на которое он, в свою очередь, отвечает. Почтовый цикл!

Я бы хотел, чтобы мой бот отвечал только на реальные письма реальных людей. В настоящее время я отфильтровываю сообщение электронной почты, которое признается массовым приоритетом, или из списка рассылки, или имеет заголовок Auto-Submitted, равный " автоответчику " или "автоматически сгенерированный" (см. код ниже). Но я думаю, что есть более полный или стандартный способ справиться с этим. (Я рад видеть решения на других языках, кроме Perl.)

Примечание: не забудьте, что ваш собственный бот объявит, что он автоматически отвечает! Включить

Auto-Submitted: auto-reply

в заголовке письма вашего бота.

Ниже приведен мой оригинальный код для избежания зацикливания почты. Отвечать только в том случае, если реальная почта возвращает 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) {

Другие советы

Это действительно звучит как то, что, вероятно, доступно в виде модуля из CPAN , но я не нашел ничего явно актуального за пять минут поиска. Mail :: Lite :: Mbox :: Processor выглядит так, как может делай что хочешь:

  

Mail :: Lite :: Message :: Matcher - это   рамки для автоматической почты   обработка. Например, у вас есть   почтовый сервер и вам нужно   обрабатывать некоторые виды входящей почты   сообщения автоматически. Например,   вы можете извлечь автоматизированный   уведомления, счета, оповещения и т. д.   из вашего потока почты и выполнить некоторые   задачи, основанные на содержании тех   сообщения.

но его документы достаточно малочисленны, поэтому сразу неясно, предоставляет ли он эти примеры функций сам, или вам нужно предоставить код для их управления.

В любом случае, если вы еще не проверили CPAN, я бы начал с этого, если бы захотел сделать что-то подобное.

Мой ответ здесь касается только отказов, что является более простым.

Использование DSN (уведомления о статусе доставки) поможет вам обнаружить DSN / отклоненное сообщение , Он должен идти в Return-Path, а не в Reply-To.

Вот пример типичного сообщения DSN . Информация заголовка включает в себя идентификатор сообщения, тип содержимого имеет определенные значения (статус доставки) и т. Д.

Не могу предоставить вам никаких кодов на Perl, только мои 2 цента идеи.

PS: обратите внимание, что не все почтовые серверы или MTA соответствуют этому, но я думаю, большинство так и делает.

Должен существовать стандартный способ решения этой проблемы, но проблема в том, что вы должны предполагать, что системы, отправляющие автоответчики, соответствуют этому стандарту, хотя в большинстве случаев они просто этого не делают.

Как получить адрес, на который вы отвечаете? Надеюсь, вы не используете заголовок From: . Сначала проверьте заголовок Reply-to: и, если он не существует, используйте Return-path: .

Но что бы вы ни делали, вам просто нужно вести журнал того, кому вы отправляли, и доводить своего бота до некоторой разумной ценности сообщений за раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top