Mysql
 sql >> Database >  >> RDS >> Mysql

Un modo sicuro per inviare posta tramite PHP a molti utenti

Non c'è motivo per cui non potresti scriverlo in PHP, anche se io non renderlo parte di una richiesta web/processo HTTP. Ho implementato con successo per dare o accettare 500.000 abbonati per mailing (a seconda dei dati locali disponibili, poiché si trattava di un progetto specifico per la posizione). Era un progetto interno, quindi sfortunatamente nessun codice/pacchetto per te, ma mi sono imbattuto in alcuni suggerimenti:

Impostazione della pubblicazione

  • Ho iniziato con phpmailer stesso, per occuparmi della formattazione, della codifica dei contenuti e delle intestazioni, dell'aggiunta di allegati, ecc. Quella parte funziona bene e non vorrei scriverla da zero.
  • L'"invio" di un'e-mail di per sé è solo l'impostazione di un flag in un database se / come / cosa deve essere inviato a (una parte di) gli abbonati.
  • Dopo che questo flag è stato impostato, verrà automaticamente raccolto da un cronjob, non più server web coinvolti.
  • Ho iniziato con un database fortemente inquinato con milioni di indirizzi email, di cui molti molti erano ovviamente non validi, quindi la prima cosa era convalidare tutti gli indirizzi e-mail per il formato, quindi per host:
    • filter_var($email, FILTER_VALIDATE_EMAIL); oltre gli iscritti (e la memorizzazione del risultato ovviamente) si sono sbarazzati delle prime centinaia di migliaia di email non valide.
    • Separazione dell'host (e archiviazione il nome host) dalle e-mail e convalidandolo (ha un record MX o almeno A in DNS, ma tieni presente:puoi inviare e-mail a un indirizzo IP [email protected][255.255.255.255] , quindi mantieni quelli validi)) mi sono sbarazzato di una buona parte in più. Gli indirizzi email qui non permanentemente disabilitati, ma con un flag di stato che indica che sono disabilitati a causa del nome di dominio/ip.
    • Gli script sono stati modificati per richiedere indirizzi email validi all'iscrizione / prima dell'inserimento, questa assurdità di 'non avrai example@ sqldat.com ' l'inquinamento degli abbonamenti nel database era semplicemente ridicolo.
  • Ora ho finito con un elenco di indirizzi email che avevano il potenziale per essere validi. Esistono essenzialmente 3 modi per rilevare indirizzi non validi (tieni presente che tutti può essere temporaneo):
    • Viene negato immediatamente dal server.
    • Il server determinato in precedenza semplicemente non ascolta il traffico.
    • Sono rimbalzati molto tempo dopo che pensavi di averli consegnati.
  • La cosa strana, i rimbalzi, per i quali ogni server di posta elettronica sembra avere un altro formato e che all'inizio erano un inferno da analizzare, si sono rivelati in realtà piuttosto facili da catturare utilizzando VERP . Piuttosto che analizzare intere email, un indirizzo email dedicato (chiamiamolo [email protected] ) è stato configurato per recapitare invece alla casella di posta, per reindirizzarlo tramite un comando e se abbiamo inviato un'e-mail a [email protected] , il Return-Path è stato impostato per [email protected] . Facilmente analizzabile alla ricezione e dopo quanti rimbalzi (la casella di posta non potrebbe esistere, la casella di posta potrebbe essere piena (sì, ancora!), ecc.) dichiari un indirizzo email inutilizzabile dipende da te.
  • Ora, la negazione diretta da parte del server. Probabilmente avremmo potuto configurare correttamente alcuni MTA e/o scrivere plug-in per quelli, ma poiché le e-mail erano sensibili al tempo e dovevamo avere un controllo assoluto configurabile per la spedizione sull'ultimo tempo di consegna utilizzabile (dopo di che l'e-mail non era più di interesse per l'utente), throttling per server ricevente, e in generale tutto, ci vorrebbe all'incirca lo stesso tempo per scrivere un mailer in PHP che conoscevamo meglio, che utilizzava il protocollo SMTP direttamente sul socket 25 sui server riceventi. Con un minimo sforzo è stata integrata la possibilità di un altro trasporto, quindi le scelte predefinite in PHPMailer. Il protocollo SMTP è in realtà abbastanza semplice, ma ci sono alcuni avvertimenti:
    • Molti server riceventi applicano il Grey Listing:alla maggior parte degli spambot non importa se arriva una posta specifica, semplicemente la sfornano. Pertanto, se un mittente sconosciuto/non ancora attendibile invia una posta, questa verrà temporaneamente rifiutata. Catturalo (di solito codice 451) e metti l'email in coda per riprovare in seguito.
    • Un server di posta, in particolare degli ISP più grandi e dei servizi gratuiti (gmail, hotmail/msn/live, ecc.) non sopporterà un torrente di posta senza reagire:dopo le prime due centinaia di migliaia, iniziano a rifiutare Voi. Ne parleremo più avanti.

Come ottenere velocità

  • Ora avevamo un sistema di consegna che funzionava, ma doveva essere veloce . Inviare 10.000 e-mail in un'ora va bene se hai solo 10.000 indirizzi a cui inviare, ma il minimo richiesto era di circa 200.000 all'ora. All'inizio era un server dedicato (che in realtà può essere piuttosto basso, indipendentemente da quello che fai, la maggior parte del tempo impiegato per la consegna delle e-mail è nella rete, non sul tuo server).
  • Memorizzazione nella cache degli IP:ricordi tutti quegli IP che abbiamo richiesto dai nomi host negli indirizzi e-mail? Ovviamente li abbiamo archiviati e cercare i loro IP ancora e ancora provoca un notevole ritardo. Tuttavia, gli IP possono cambiare:un record DNS lì, un altro MX in un altro posto... i dati diventano obsoleti velocemente. La maggior parte delle volte il server in realtà non invia nulla (le newsletter in abbonamento arrivano ovviamente a raffica), un cronjob a bassa priorità è in esecuzione controllando tutti i nomi host con un IP obsoleto (abbiamo scelto un indirizzo IP più vecchio di 1 giorno) per un indirizzo IP , compresi quelli che prima non ne avevano (i nuovi domini vengono registrati continuamente, quindi perché un dominio non dovrebbe diventare disponibile il giorno dopo che qualcuno già si è iscritto con entusiasmo con il suo indirizzo email nuovo di zecca? Oppure i problemi del server con alcuni domini sono stati risolti, ecc.). In realtà l'invio delle email ora non richiedeva più ricerche di dominio.
  • Riutilizzo della connessione SMTP:l'impostazione di una connessione a un server richiede una parte relativamente grande del tempo per consegnare un'e-mail quando si parla direttamente alla porta 25. Non è necessario impostare una nuova connessione per ogni e-mail, puoi semplicemente inviare il successivo tramite la stessa connessione. Un po 'di trail-and-error ha portato a impostare l'impostazione predefinita qui su circa 50 e-mail per connessione (supponendo che tu ne abbia così tante o più per il dominio). Tuttavia, in caso di errore di chiusura e riapertura di un indirizzo e-mail, la connessione per un nuovo tentativo a volte ha aiutato. Tutto sommato, questo davvero ha contribuito a velocizzare le cose.
  • Qualcuno ovvio, così ovvio che ho quasi dimenticato di menzionarlo:sarebbe uno spreco dover creare il corpo dell'e-mail sul posto:se è un messaggio generico, tieni il corpo pronto (ho modificato un po' PHPMailer in essere in grado di utilizzare un'e-mail memorizzata nella cache), possibilmente giorni prima (se sai invierai una mail venerdì e il tuo server è inattivo, perché non prepararli già mercoledì? Se è personalizzato, puoi comunque prepararlo in anticipo con un tempo sufficiente, in caso contrario, almeno le porzioni non personalizzate aspettano di andare.
  • Più processi. Ho già detto che la maggior parte del tempo impiegato per consegnare la posta elettronica viene speso sulla rete? Un processo di spedizione non sta ottenendo il massimo dal tuo server di posta elettronica, un carico appena percettibile e le e-mail stanno uscendo. Gioca con una serie di processi che inviano e-mail a diverse porzioni della coda per vedere cosa è giusto per il tuo server/connessione, ma ricorda 2 cose molto importanti:
    • Diversi processi ti rendono molto vulnerabile alle condizioni di gara:sii davvero assolutamente sicuro hai un sistema completo che non lo farà mai inviare la stessa mail due volte (tre volte, di più). Non solo infastidisce seriamente gli utenti, ma il tuo spam va a un livello superiore.
    • Mantieni i domini uniti ove possibile:selezionando casualmente dalla coda perderai il vantaggio di mantenere una connessione aperta al server che riceve le email per il dominio.

Evitare gli scarti

  • Invierai molta posta. Questo è esattamente ciò che fanno gli spammer. Tuttavia, non vuoi essere visto come uno spammer (dopotutto, non lo sei, vero)? Esistono numerosi meccanismi in atto che aumenteranno notevolmente la tua affidabilità nei confronti dei server di ricezione:
  • Avere un DNS inverso appropriato:i processi controllano il DNS appartenente all'IP che sta inviando l'e-mail piace molto molto se i domini di secondo livello corrispondono:stai inviando posta per conto di example.com ? Assicurati che il DNS inverso del tuo server sia qualcosa come nome.esempio.com .
  • Pubblica i record SPF per il tuo dominio:indica esplicitamente che la macchina utilizzata per inviare la tua e-mail in blocco è consentita e dovrebbe inviare posta con quell'intestazione From/Return-Path.
  • ricorda i rifiuti :ai server non piace dirti ancora e ancora che non esistono indirizzi email diversi. O i meccanismi automatizzati, e persino gli amministratori umani, hanno bloccato il nostro server mentre lavoravamo su tutti gli indirizzi e-mail non convalidati che (non più) esistevano. Non abbiamo utilizzato un double opt-in fino a tardi, quindi il database è stato inquinato da errori di battitura, persone che hanno cambiato IP e quindi indirizzo e-mail, indirizzi e-mail scherzosi e così via. Assicurati di catturare quegli invalidi e, dato un numero sufficiente di fallimenti o sever abbastanza, annulla loro l'iscrizione . Non ti stanno facendo bene, stanno monopolizzando le risorse e se vogliono davvero che tu e-mail e la casella di posta diventa disponibile in seguito, dovranno semplicemente abbonarsi di nuovo.
  • DKIM è un altro meccanismo che può aumentare la tua affidabilità, ma poiché non l'abbiamo ancora implementato, non posso dirti molto al riguardo.
  • Record MX:ad alcuni server piace ancora se il tuo server di invio è anche il server di ricezione del dominio. Come all'epoca, avevamo solo 1 MX e, poiché il server di posta non era ancora molto occupato, lo abbiamo soprannominato il server MX di riserva per il dominio. Il normale server MX non il server che invia gli abbonamenti, poiché è molto irritante essere temporaneamente bloccato da un server a cui stai tentando di inviare un'e-mail importante (client ecc.) perché hai già inviato un carico di posta meno importante. Ha la massima preferenza per la ricezione di MX, ma nel caso in cui fallisse, avevamo il bel vantaggio che il nostro server di invio dell'abbonamento sarebbe ancora un fallback per la consegna, quindi in caso di crisi potremmo ancora arrivarci, impedendo scomodi rimbalzi ai clienti che provano per raggiungerci.
  • Parla loro di te. Sul serio. Molti dei principali attori di indirizzi e-mail gratuiti come live.com ti offrono l'opportunità di registrarti in qualche modo o di avere un punto di contatto a cui rivolgersi per aiuto e supporto se le tue e-mail vengono rifiutate. Se hai un motivo legittimo per inviare così tante e-mail, ed è credibile che tu abbia così tanti abbonati, è probabile che aumentino seriamente il numero di e-mail che puoi inviare al loro server all'ora. Un misero 1.000 può diventare da qualche parte tra i diecimila o anche più se sei abbastanza persuasivo e onesto. Potrebbero esserci contratti, requisiti che devi soddisfare e promesse che devi fare (e mantenere) per poterlo permettere. Gli ISP sono un marchio a parte e ogni altro giocatore è diverso. Non preoccuparti di chiamarli di solito, perché il 99% delle volte gli unici numeri che puoi trovare avranno solo persone disposte a risolvere i problemi della tua connessione Internet, che capiscono (o sono consentite) poco altro. Un [email protected] l'indirizzo e-mail è un buon punto di partenza, ma vedi se riesci a trovare un indirizzo e-mail più mirato da qualche parte. Sii preciso, onesto e completo:all'incirca quanti di voi abbonati hanno un indirizzo e-mail con quell'ISP, quanto spesso provi a inviargli un'e-mail, quali sono gli errori o i rifiuti che ricevi, com'è il processo di iscrizione e annullamento dell'iscrizione e cos'è il servizio che offri effettivamente ai loro clienti. Inoltre, sii gentile:quanto possa essere vitale l'invio di quelle e-mail per la tua attività, andare nel panico e dichiarare perdite terribili non li riguarda. Una dichiarazione educata di fatti e desideri e chiedere se possono aiutare piuttosto che chiedere una soluzione fa molto.
  • Throttling:per quanto tu abbia provato, alcuni server accetteranno solo una certa quantità di posta all'ora e/o al giorno da te. Impara quei numeri (stiamo registrando comunque successi e fallimenti), impostali su un valore predefinito ragionevole per i domini normali, impostali su limiti concordati per i giocatori più grandi.

Evitare di essere contrassegnati come spam

  • Prima regola:non spammare!
  • Seconda regola:mai! Non un 'una tantum', non un 'non si sono iscritti ma questo potrebbe essere l'affare della vita per loro', non con le migliori intenzioni, le persone hanno dovuto chiedere le tue email.
  • Ovviamente imposta un corretto meccanismo di iscrizione double opt-in.
  • PHPMailer imposta da solo le intestazioni corrette
  • Imposta un semplice meccanismo di annullamento dell'iscrizione via web (includi un link in ogni mail), eventualmente anche e-mail e servizio clienti se ce l'hai. Assicurati che il servizio clienti può annullare l'iscrizione direttamente alle persone.
  • Come detto in precedenza:l'annullamento dell'iscrizione (eccessivo) non riesce e rimbalza.
  • Evita le parole di spam "affare di una vita".
  • Utilizza gli URL nelle tue email con moderazione.
  • Evita di aggiungere link a domini fuori dal tuo controllo, a meno che tu non sia assolutamente sicuro di poterti fidare di loro non allo spam, se anche allora...
  • Fornisci valore all'utente:essere contrassegnati come spam dall'interazione dell'utente nei client webmail di google/yahoo/live danneggia seriamente i successi futuri (nota su un sito:se ti iscrivi, live/msn/hotmail inoltrerà tutto email che ti invii dal tuo dominio che è contrassegnato come spam dagli utenti. Impara ad amarlo e, come sempre:annulla l'iscrizione, chiaramente non vogliono il tuo centro commerciale e stanno danneggiando il tuo punteggio di spam).
  • Controlla le blacklist per il tuo IP. Se compari su uno di questi, è ciao ciao, quindi immetti l'azione sia nel riabilitare il tuo nome che è necessario determinare il caso.

Misurazione del tasso di successo

  • Con l'intero processo sotto il tuo controllo, sei ragionevolmente sicuro che l'email sia finita da qualche parte (anche se potrebbe essere il bitbucket dell'MX o una cartella spam), oppure hai registrato un errore e il motivo. Questo si occupa dei numeri "effettivamente consegnati".
  • Alcune persone cercheranno di convincerti ad aggiungere link a immagini online alle tue e-mail (reali o la famosa gif trasparente 1x1) per misurare quante persone leggono effettivamente la tua e-mail. Poiché un'alta percentuale blocca quelle immagini, questi numeri sono nella migliore delle ipotesi traballanti e riteniamo che non dovremmo preoccuparci di loro, i loro numeri sono assolutamente inaffidabili.
  • La soluzione migliore per misurare il tasso di successo effettivo è molto più semplice se vuoi che gli utenti facciano qualcosa. Aggiungi parametri ai link nella posta, così puoi misurare quanti utenti arrivano al sito che hai collegato, se hanno eseguito le azioni desiderate (guardato un video, lasciato un commento, acquistato beni).

Tutto sommato, con tutta la registrazione, l'interfaccia utente, le impostazioni configurabili per dominio/e-mail/utente ecc. Ci sono voluti circa 1,5 mesi uomo per costruire e appianare le stranezze. Potrebbe essere un bel investimento rispetto all'esternalizzazione delle e-mail, potrebbe non esserlo, tutto dipende dal volume e dall'attività stessa.

Ora, iniziamo a dire che sono stato un pazzo a scrivere un MTA in PHP, mi è piaciuto molto (che è una delle ragioni per cui ho scritto questa enorme quantità di testo) e le capacità di registrazione e impostazioni estremamente versatili, per host gli avvisi basati sulla percentuale di errore ecc. stanno rendendo la vita davvero facile;)