2015-09-23 23 views
6

Sto usando PHPMailer per inviare e-mail che funziona benissimo. Tuttavia, il problema è che poiché invia l'e-mail in modo sincrono, il caricamento della pagina successiva richiede molto tempo.Invia e-mail in modo asincrono via PhpMailer

Sto usando PHPMailer come mostrato in questo esempio https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps

mi chiedo se c'è un modo di effettuare la consegna di posta elettronica asincrona. Ho studiato questo e ha scoperto che sendmail ha un'opzione per impostare DeliveryMode a "modalità background" - fonte http://php.net/manual/en/function.mail.php

mail($to, $subject, $message, $headers, 'O DeliveryMode=b'); 

Voglio sapere se qualcosa di simile può essere fatto in PHPMailer? Qualcuno ha avuto qualche successo con questo?

EDIT: - (Ulteriori informazioni) Sembra PHPMailer può essere configurato per utilizzare sendmail - https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php Perciò mi chiedo se questo può essere in qualche modo sfruttato per consentire la consegna di sfondo.

/** 
* Which method to use to send mail. 
* Options: "mail", "sendmail", or "smtp". 
* @type string 
*/ 
public $Mailer = 'mail'; 

/** 
* The path to the sendmail program. 
* @type string 
*/ 
public $Sendmail = '/usr/sbin/sendmail'; 
/** 
* Whether mail() uses a fully sendmail-compatible MTA. 
* One which supports sendmail's "-oi -f" options. 
* @type boolean 
*/ 
public $UseSendmailOptions = true; 

/** 
* Send messages using $Sendmail. 
* @return void 
*/ 
public function isSendmail() 
{ 
    $ini_sendmail_path = ini_get('sendmail_path'); 
    if (!stristr($ini_sendmail_path, 'sendmail')) { 
     $this->Sendmail = '/usr/sbin/sendmail'; 
    } else { 
     $this->Sendmail = $ini_sendmail_path; 
    } 
    $this->Mailer = 'sendmail'; 
} 

anche - a quanto pare c'è modo di impostare le opzioni di sendmail tramite php.ini http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/

Preferirei fare questo come un argomento in linea per la chiamata API vs php.ini in modo che isnt un globale modificare. Qualcuno ha provato questo?

risposta

14

Approccio errato.

PHPMailer non è un server di posta, che è quello che stai chiedendo di essere. L'SMTP è un protocollo verboso e chiacchierone che è soggetto a ritardi e a un throughput lento ed è assolutamente inadatto all'invio interattivo durante una tipica operazione di invio a una pagina Web (che è probabilmente l'applicazione alla domanda BlackHatSamurai). Molti riescono a fare esattamente questo, ma non fatevi ingannare dal pensare che sia una buona soluzione, e sicuramente non provate a implementare un MTA da soli.

L'esempio di gmail a cui è collegato sta utilizzando SMTP a un server remoto, che sarà sempre più lento dell'invio locale. Se stai inviando tramite sendmail (o mail() - praticamente è la stessa cosa) a un server locale e impiega più di 0,1 secondi, stai facendo qualcosa di molto sbagliato. Persino SMTP a localhost non impiegherà molto più tempo e l'invio a uno smarthost nelle vicinanze è improbabile che sia troppo lento.

Provare a fare lo sfondo con i thread è una massiccia scatola di worm che non è esattamente il modo di procedere - qualunque cosa tu ottenga in questo modo sarebbe terribile rispetto a un server di posta adeguato. Basta non farlo.

Il modo giusto per eseguire questa operazione è installare un server di posta locale e inviare i messaggi ad esso con PHPMailer. In questo modo è molto veloce (centinaia di messaggi al secondo) e devi fare esattamente niente per farlo funzionare perché è così che PHPMailer funziona di default.

Il server di posta eseguirà quindi ciò che deve fare: accodare il messaggio, gestire problemi di connessione, rinvii di consegna, rimbalzi e tutto ciò che non è stato preso in considerazione.

+0

Risposta fantastica. Grazie per la spiegazione dettagliata. Molto apprezzato!! Sono un po 'un noob quando si tratta di questo argomento - avete qualche consiglio su quale server di posta scegliere/installare. Sono su un piano di hosting condiviso. Non sono sicuro se il mio webhost mi consentirà di installarne uno personalizzato. – rogerb

+0

La maggior parte delle distribuzioni di Linux usano postfix, che preferisco exim. Ce ne sono molti altri però. Se il tuo ISP non ti consente di installarne uno, probabilmente forniscono già qualcosa o uno smarthost nelle vicinanze - controlla i loro documenti, apri un ticket di supporto. In caso contrario, suggerirei di installare un nuovo fornitore di servizi ... – Synchro

+1

Grazie a @Synchro. Ho finito per utilizzare il server di posta predefinito fornito dal mio provider di hosting e ho notato (con il timestamping) che impiegava circa 2 secondi per email. Così ho chiamato il mio webhost e mi hanno detto che da quando ero su un piano di hosting condiviso, si aspettava quel ritardo (a quanto pare il loro server di posta invia a un proxy dove è in coda prima di inviarlo). Alla fine ho impostato "-O DeliveryMode = b" nel mio php.ini (http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/) che fatto una differenza enorme. Le e-mail vengono ora inviate in modalità background e il mio script ritorna in ** 0.16 secondi! ** – rogerb

0

In base a thisphpMailer non supporta questo tipo di chiamata. Dovresti scrivere la tua classe filettata per fare una chiamata asincrona. Vedi pThreads e la classe Thread. Un'altra soluzione è stata trovata here.

+0

Grazie per la risposta e i collegamenti. Mi chiedo se questo sia completamente preciso (aggiornato) perché phpMailer sembra consentire a sendmail come meccanismo di consegna. Modificherò la mia domanda e aggiungerò queste informazioni. – rogerb

+0

@rogerb, indipendentemente da dover riscrivere la classe Sendmail per utilizzare un thread asincrono. – BlackHatSamurai

+0

Che ne dici di usare uno smarthost? – Phil