Domanda

Sto pensando a come gestire l'invio di grandi quantità di e-mail dalle mie applicazioni Web e se ci sono delle migliori pratiche per farlo. StackOverflow sta già etichettando questo come 'soggettivo', che potrebbe essere in una certa misura, ma devo conoscere il modo più efficace per implementare questo sistema o se esiste un approccio standardizzato.

Nella mia webapp, ci sono utenti che fanno capo a gruppi da 1 a 10.000 utenti. Questo utente deve essere in grado di inviare tramite e-mail un messaggio a tutti questi utenti tramite il mio sistema. Pertanto, il mio sistema è responsabile dell'invio di un massimo di 10.000 e-mail a singoli utenti per ciascun capogruppo.

Per quanto ne so, in GMail non vi è alcun limite di velocità per l'invio di messaggi a singoli (sebbene ci sia un massimo di 500 destinatari).

In questo momento, la mia configurazione attuale è:

  • Quando un messaggio viene inviato attraverso il sistema, entra in una coda di posta elettronica.
  • Uno script cron prende i messaggi dalla coda ogni pochi minuti e invia quelle e-mail.
  • Tutta l'e-mail avviene tramite il server SMTP di GMail.
  • L'applicazione effettiva che sta effettuando l'invio è PHPMailer.

Questa configurazione, man mano che la base di utenti cresce, probabilmente non sarà sufficiente. Le domande che ho sono:

  1. Dovrei invece utilizzare un server SMTP locale?
  2. Devo usare invece un file binario di posta sul computer locale? In questo caso, potrei probabilmente saltare del tutto la coda?
  3. Esiste un modo accettato per farlo?

Grazie!

È stato utile?

Soluzione

Con un conteggio email come " alto " come 10.000 al giorno, non farei affidamento su SMail GMail (o qualsiasi altro). Non che non riescano a gestirlo, ovviamente possono gestire MOLTO di più. Ma forse non vogliono.

Avere un server SMTP locale è IMO la strada da percorrere:

  • È abbastanza facile da configurare (solo NON permettere alle persone di usarlo senza un forte schema autentico)
  • I più moderni MTA gestiscono molto bene le code di invio
  • Non dovrai occuparti di GMail (o di altri) decidendo di bloccare il tuo account un giorno per motivi di quote

Altri suggerimenti

Google App Engine

Lo scriverei nel motore di app di Google (python) perché:

  • Si adatta bene.
  • Ha una buona e-mail API.
  • Ha un taskqueue con una buona API per accedervi.
  • Perché python è un linguaggio davvero carino.
  • È (relativamente) economico.

PHP

Se lo implementassi in PHP lo farei

  • Trova un buon server SMTP che ti consenta di inviare questo volume di messaggi perché Gmail non ti consentirà di inviare questo tipo di volume. Sono sicuro che questo ti costerà del denaro.
  • Trovati una libreria di posta elettronica PHP decente per inviare messaggi come ad esempio PHPMailer come hai detto.
  • Utilizzare una coda di messaggi come ad esempio beanstalkd per mettere i messaggi e-mail in coda e inviarli in modo asincrono. Innanzitutto perché con questo l'utente avrà un caricamento della pagina più scattante. In secondo luogo con una coda di messaggi come beanstalkd è possibile regolare meglio la velocità di invio che eviterà di sovraccaricare il PC con il lavoro. È necessario disporre dell'accesso ssh al server per compilare (installare) beanstalkd. Puoi trovare beanstalkd su beanstalkd
  • Avresti anche bisogno dell'accesso ssh per eseguire uno script PHP in background che elaborerà la coda dei messaggi. Puoi trovare un client beanstalkd su php beanstalkd-client

da php / apache / pagina web

Questa è la pagina da cui invierai i messaggi all'utente. Da questa pagina invierai un messaggio a beanstalkd codificando qualcosa come segue:

// register Pheanstalk class loader
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk('127.0.0.1');
$message = ""; // This would contain your message
$pheanstalk->put(json_encode($message);

Devi inserire i messaggi nella coda dei messaggi usando il comando put

Dallo script PHP a lunga esecuzione in background:

Il codice sarebbe simile al seguente:

// register Pheanstalk class loader
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk('127.0.0.1');

while(true) {
  $job =  $pheanstalk->reserve();
  $email = json_decode($job->getData());
  // Sent email using PHP mailer.
  $pheanstalk->delete($job);
}

Come sto dicendo, è possibile sia con PHP che con il motore di app di Google, ma preferirei il motore di app perché è più facile da implementare.

Gmail e Google Apps ti limitano a circa 500 email al giorno. Non sono sicuro di come si combini con il numero massimo di 500 destinatari, ma se si desidera inviare 10.000 e-mail, è probabile che si desideri trovare un altro server di posta. Uso personalmente un server locale o l'ISP o SMTP del datacenter.

Se stai inviando così tante e-mail, ti consiglio di utilizzare la coda in modo che l'utente non sia seduto lì in attesa che l'e-mail venga inviata.

Fai molta attenzione a non inserire nella tua lista nera un dominio di spam. In tal caso, puoi aspettarti che la maggior parte delle tue e-mail sia bloccata, supporto, vendite, ecc. Che a sua volta potrebbe essere molto costoso.

Potresti invece voler utilizzare un servizio come AWeber . Non solo sono configurati per gestire queste quantità di email, ma probabilmente possono darti più parametri di quanti tu possa implementare da solo.

Non sono sicuro che sia pubblicato da nessuna parte, ma per esperienza posso dirti che Gmail metterà un blocco di circa quindici minuti sul tuo account se inizi a inviare centinaia di messaggi alla volta. Questo è successo a me la scorsa settimana. Penso che dovresti ospitare il tuo server SMTP. L'uso della funzione mail () spesso inserirà la tua posta nella cartella spam di qualcuno.

Installa Postfix sul computer locale o su un computer sulla stessa LAN per la massima velocità di accesso. Assicurati che sia ben protetto dall'esterno e rapidamente accessibile dall'interno.

Quindi codifica il tuo script PHP per iniettare direttamente le e-mail nella coda Postfix. Ciò aumenterà notevolmente la velocità di elaborazione della consegna della posta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top