2009-11-29 5 views
9

Ho un bot che risponde agli utenti. Ma a volte quando il mio bot invia la sua risposta, l'utente o il suo provider di posta elettronica risponderà automaticamente (messaggio vacanza, messaggio di mancato recapito, errore da mailer-daemon, ecc.). Questo è quindi un nuovo messaggio da parte dell'utente (così pensa il mio bot) a cui risponde a sua volta. Loop di mail!Come rendere un bot di posta elettronica che risponde agli utenti che non rispondono alle risposte automatiche e si inseriscono nei loop di posta

Vorrei che il mio bot rispondesse solo alle e-mail reali di veri umani. Attualmente sto filtrando le e-mail che ammettono di avere la precedenza di massa o da una mailing list o l'intestazione Auto-Submitted è uguale a "auto-reply" o "auto-generated" (vedi il codice sotto). Ma immagino ci sia un modo più completo o standard per affrontare questo. (Sono felice di vedere soluzioni in altre lingue oltre a Perl.)

NB: Ricordarsi di fare in modo che il proprio bot dichiari che è autorispondente! Includi

Auto-Submitted: auto-reply 

nell'intestazione dell'e-mail del tuo bot.

Il mio codice originale per evitare i loop di posta segue. Rispondi solo se realmail restituisce 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 
     ); 
} 

(Il check soggetto è sicuramente inutile, ho solo aggiunto questi controlli una alla volta come i problemi sorti e il sopra ora sembra funzionare in modo da non voglio toccare a meno che non ci sia qualcosa di definitivo meglio.)

+2

Personalmente preferisco i bot che sono limitati dal tempo (ad esempio, inviare un'email a una persona al massimo una email in un'ora). Non mi piace ricevere tonnellate di notifiche di ferie quando invio molte e-mail contemporaneamente. – notnoop

+0

Ottimo punto, notnoop. Qualunque cosa tu faccia, una rete di sicurezza a limite di velocità come quella è intelligente. – dreeves

risposta

8

RFC 3834 fornisce alcune linee guida per ciò che si dovrebbe fare, ma qui ci sono alcune linee guida concrete:

impostare il proprio mittente della busta a un indirizzo email diverso da quello auto-responder così rimbalzi non si nutrono nel sistema .

Memorizzo sempre in un database una chiave di quando una risposta di posta elettronica è stata inviata da un indirizzo specifico a un altro indirizzo. In nessun caso potrò mai rispondere allo stesso indirizzo più di una volta in un periodo di 10 minuti. Questo da solo ha fermato tutti i loop, ma non garantisce un buon comportamento (le risposte automatiche alle mailing list sono fastidiose).

Assicurati di aggiungere qualsiasi permutazione di intestazione su cui altre persone stanno facendo corrispondenze per fermare i loop. Ecco la lista che uso:


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

Ecco alcuni regex intestazione di che uso per evitare loop e cercare di bel gioco:


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

Ho anche evitare di rispondere se uno di questi sono i mittenti avvolge:


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) { 
1

La mia risposta qui riguarda solo rimbalzi che sono più semplici.

L'utilizzo dell'identificatore DSN (Delivery Status Notification) consente di rilevare un messaggio DSN/rimbalzato. Dovrebbe andare su Return-Path e non Reply-To.

Ecco un esempio di un tipico DSN message. Le informazioni dell'intestazione includono l'id del messaggio, il tipo di contenuto ha valori specifici (stato di consegna) ecc.

Non è possibile fornire alcun codice in perl, solo i miei 2 centesimi di idea.

PS: Si noti che non tutti i server di posta o MTA sono conformi a questo, ma credo che la maggior parte lo faccia.

2

Che in realtà suona come qualcosa che è probabilmente disponibile come modulo da CPAN, ma non ho trovato nulla di chiaramente rilevante in cinque minuti di ricerca. Mail::Lite::Mbox::Processor sembra che potrebbe fare quello che vuoi:

Mail :: Lite :: :: Messaggio Matcher è un framework per automatizzato di posta elaborazione. Ad esempio, si dispone di un server di posta e si ha la necessità di elaborare automaticamente alcuni tipi di messaggi di posta in arrivo . Ad esempio, è possibile estrarre le notifiche automatiche , le fatture, gli avvisi ecc. dal flusso di posta ed eseguire alcune attività in base al contenuto di tali messaggi .

ma i suoi documenti sono abbastanza rari da non essere immediatamente ovvio se fornisce le stesse funzioni di esempio o se è necessario fornire il codice per guidarli.

In ogni caso, se non hai già controllato CPAN, è da lì che vorrei iniziare se volevo fare qualcosa di simile.

1

Ci dovrebbe essere un modo standard per gestire questo, ma il problema è che dovresti pensare che i sistemi che inviano risposte automatiche siano conformi a quello standard, quando la maggior parte delle volte non lo fanno.

Come si ottiene l'indirizzo a cui si risponde? Spero che non stiate usando l'intestazione From:. Controlla prima l'intestazione Reply-to: e se non esiste, utilizza Return-path:.

Ma qualunque cosa tu faccia, dovrai semplicemente tenere un registro di ciò che hai inviato a chi e limitare il tuo bot a un valore ragionevole dei messaggi per volta.