2015-01-06 14 views
5

C'è un modo per utilizzare la classe "Event" di Laravel per eseguire del codice prima che venga inviata ogni e-mail? Mi piacerebbe anche la possibilità di annullare lo Mail::send();.Laravel Mail Listener (Prima di inviare - Possibilità di annullare)

Naturalmente potrei fare questo prima di inviare una e-mail:

Event::fire('email.beforeSend'); 

E poi ho potuto ascoltare in questo modo:

Event::listen('email.beforeSend', function() 
{ 
    //my code here 
}); 

Il problema di questo è che devo ricordare a correre Event::fire() che preferirei non fare. Nel mio caso sto rimbalzando l'indirizzo email contro un elenco di annullamento dell'iscrizione per assicurarmi di non inviare spam.

risposta

4

Laravel's Mail classe incendi mailer.sending come parte del processo di invio.

protected function sendSwiftMessage($message) 
{ 
    if ($this->events) 
    { 
     $this->events->fire('mailer.sending', array($message)); 
    } 

    if (! $this->pretending) 
    { 
     $this->swift->send($message, $this->failedRecipients); 
    } 
    elseif (isset($this->logger)) 
    { 
     $this->logMessage($message); 
    } 
} 

Si poteva cogliere questo evento e regolare l'oggetto $message, o è probabile che si potrebbe impedire l'invio chiamando Mail::pretend(); all'interno del vostro gestore di eventi.

+0

Interessante. Quindi il mio listener sembrerebbe 'Event :: listen ('mailer.sending', function() {});'? Non ho familiarità con 'Mail :: pretend();' Sto indovinando che fa la stessa cosa di ''fingere' => false' in config. Ti scherzo con questo e torno da te. – sterfry68

+0

Penso che 'Mail :: pretend();' "fingerebbe" di inviare un'altra email ma non cancellerebbe l'email corrente. Ho ragione? http://laravel.com/docs/4.2/mail#mail-and-local-development – sterfry68

+0

Attiva la modalità "fingere". Le righe successive in "sendSwiftMessage" controllano la modalità e salta l'invio. – ceejayoz