Como fazer um bot de e-mail que as respostas para os usuários não responda a auto-respostas e obter-se em ciclos de correio

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

Pergunta

Eu tenho um bot que as respostas para os usuários. Mas às vezes quando meu bot envia sua resposta, o usuário ou o seu provedor de e-mail será automaticamente responder (mensagem de férias, mensagem devolvida, erro do mailer-daemon, etc). Que é, então, uma nova mensagem do usuário (por isso o meu bot pensa) que nas respostas recorrer. ciclo de correio!

Eu gostaria de minha bot para responder apenas a e-mails reais dos seres humanos reais. Atualmente estou filtrando e-mail que admite ser precedência granel ou de uma lista de discussão ou tem o Auto-Submetido cabeçalho igual a "respondeu auto-" ou "auto-gerado" (ver código abaixo). Mas imagino que há uma maneira mais abrangente ou padrão para lidar com isso. (Eu estou feliz de ver soluções em outros idiomas além do Perl.)

Nota: Lembre-se de ter o seu próprio declarar bot que está autoresponding! Incluir

Auto-Submitted: auto-reply

no cabeçalho do e-mail do seu bot.

Meu código original para evitar loops de email segue. Só responda se retorna realmail verdade.

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
          );
}

(A verificação Assunto é certamente desnecessária;. Acabei de adicionar essas verificações um de cada vez, como problemas surgiram e acima agora parece funcionar, então eu não quero tocá-lo, a menos que há algo definitivamente melhor)

Foi útil?

Solução

RFC 3834 dá algumas orientações para o que você deve fazer, mas aqui estão algumas orientações concretas:

Defina o seu remetente envelope para um endereço de e-mail diferente do que o seu auto-responder de modo saltos não se alimentam de volta para o sistema.

Eu sempre armazenar em um banco de dados de uma chave de quando uma resposta de e-mail foi enviado de um endereço específico para outro endereço. Sob nenhuma circunstância eu vou sempre responder para o mesmo endereço mais de uma vez em um período de 10 minutos. Isso por si só parou todos os loops, mas não garante um comportamento agradável (auto-respostas para listas de discussão são irritantes).

Certifique-se de adicionar qualquer permutação de cabeçalho que outras pessoas estão combinando para loops de parada. Aqui está o uso lista I:


X-Loop: autoresponder
Auto-Submitted: auto-replied
Precedence: bulk (autoreply)

Aqui estão uso I alguns de regex cabeçalho para loops de evitar e tentar jogar bonito:


 /^precedence:\s+(?:bulk|list|junk)/i
 /^X-(?:Loop|Mailing-List|BeenThere|Mailman)/i
 /^List-/i
 /^Auto-Submitted:/i
 /^Resent-/i

Eu também evitar responder se algum destes são os remetentes 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) {

Outras dicas

Isso realmente soa como algo que é provavelmente disponíveis como um módulo de CPAN , mas eu não encontrar nada claramente relevante em cinco minutos de busca. Mail :: Lite :: Mbox :: processador parece que pode fazer o que quiser:

Mail :: Lite :: Mensagem :: Matcher é um quadro para o correio automatizado em processamento. Por exemplo, você tem um correio servidor e você tem uma necessidade de processar alguns tipos de e-mails recebidos mensagens automaticamente. Por exemplo, Você pode extrair automatizado notificações, notas fiscais, alertas etc. a partir de seu e-mail fluir e realizar alguma tarefas com base no conteúdo dos mensagens.

mas seus documentos são suficientes esparsa que não é imediatamente óbvio se ele oferece esses próprio exemplo funções ou se você tem que fornecer o código para conduzi-los.

Em qualquer caso, porém, se você ainda não tiver verificado CPAN, que é onde eu iria começar se eu queria fazer algo como isto.

A minha resposta aqui só lida com saltos que é mais simples.

Usando DSN (Delivery Status Notification) identificador irá ajudá-lo a detectar um DSN / mensagem devolvida . Ele deve ir para Return-Path e não Responder a.

Aqui está um exemplo de um típico DSN mensagem . A informação de cabeçalho inclui a ID de mensagem, o tipo de conteúdo tem valores específicos (estado de entrega), etc.

Não é capaz de fornecer-lhe os códigos em perl, apenas meus 2 centavos de idéia.

PS: Nota Do que nem todos os servidores de correio ou MTA está em conformidade com isso, mas eu acho que a maioria faz.

Deve haver uma maneira padrão de lidar com isso, mas o problema é que você tem que assumir que os sistemas que enviam respostas automáticas cumprem a referida norma, na maioria das vezes, eles simplesmente não fazer.

Como você recebe o endereço que você responde a? Eu espero que você não está usando o cabeçalho From:. Verifique o cabeçalho Reply-to: primeiro e se isso não existir, utilize o Return-path:.

Mas o que você faz, você simplesmente tem que manter um registro do que você enviou para quem e acelerador seu bot para algum valor razoável de mensagens por hora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top