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
-
06-07-2019 - |
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)
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.