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

У меня есть бот, который отвечает пользователям. Но иногда, когда мой бот отправляет свой ответ, пользователь или его провайдер электронной почты автоматически отвечают (сообщение об отпуске, сообщение об отказе, ошибка от 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
          );
}

(Проверка «Тема» определенно не нужна; я просто добавлял эти проверки по одной, поскольку возникали проблемы, и вышеприведенное теперь, похоже, работает, поэтому я не хочу к нему прикасаться, если нет чего-то определенного лучше.)

Ответы [ 4 ]

8 голосов
/ 30 ноября 2009

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) {
2 голосов
/ 29 ноября 2009

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

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

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

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

1 голос
/ 29 ноября 2009

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

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

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

1 голос
/ 29 ноября 2009

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

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

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

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

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

...