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

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

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

NB: помните, что ваш собственный бот объявляет, что он автоответчик! Включить

Auto-Submitted: auto-reply

в заголовке электронной почты вашего бота.

мой исходный код для предотвращения почтовых циклов следует. Только ответ, если realmail возвращает истинный.

sub realmail {
  my($email) = @_;
  $email =~ /nSubject:s*([^n]*)n/s;
  my $subject = ;
  $email  =~ /nPrecedence:s*([^n]*)n/s;
  my $precedence = ;
  $email  =~ /nAuto-Submitted:s*([^n]*)n/s;
  my $autosub = ;

  return !($precedence =~ /bulk|list|junk/i ||
           $autosub =~ /(auto-replied|auto-generated)/i ||
           $subject =~ /^undelivered mail returned to sender$/i
          );
}

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

4 ответов


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

Я также избегаю отвечать, если какой-либо из них является отправителем Envelope:


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:: Процессор похоже, это может сделать то, что вы хотите:

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

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

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


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

используя DSN (уведомление о статусе доставки) идентификатор поможет вам обнаружить сообщение DSN / bounced. Он должен идти по обратному пути, а не отвечать.

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

не в состоянии предоставить вам какие-либо коды в perl, просто мои 2 цента идеи.

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


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

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

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