2014-10-24 15 views
12

Ho configurato il servizio di posta di laravel con il driver mandrill. Nessun problema qui!configurazioni di posta multiple

Ora, a un certo punto della mia domanda, ho bisogno di inviare una mail via gmail.

ho fatto qualcosa di simile:

// backup current mail configs 
$backup = Config::get('mail'); 

// rewrite mail configs to gmail stmp 
$new_configs = array(
    'driver' => 'smtp', 
    // ... other configs here 
); 
Config::set('mail', $new_configs); 

// send the email 
Mail::send(... 

// restore configs 
Config::set('mail', $backup); 

Questo lavoro doens't, laravel utilizza sempre le configurazioni mandrillo. Sembra che avvii il servizio di posta all'avvio di script e ignori tutto ciò che fai durante l'esecuzione.

Come si modifica il comportamento/le configurazioni del servizio di posta durante l'esecuzione?

risposta

24

È possibile creare una nuova istanza Swift_Mailer e l'uso che:

// Backup your default mailer 
$backup = Mail::getSwiftMailer(); 

// Setup your gmail mailer 
$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl'); 
$transport->setUsername('your_gmail_username'); 
$transport->setPassword('your_gmail_password'); 
// Any other mailer configuration stuff needed... 

$gmail = new Swift_Mailer($transport); 

// Set the mailer as gmail 
Mail::setSwiftMailer($gmail); 

// Send your message 
Mail::send(); 

// Restore your original mailer 
Mail::setSwiftMailer($backup); 
+3

funziona come un fascino. per quelli che potrebbero cercare, SmtpTransport proviene da usare Swift_SmtpTransport come SmtpTransport; – cmancre

+0

L'ho usato per fare la differenza tra e-mail "normali" e e-mail "di sistema". Funziona alla grande, grazie! – Jurgen

+0

Risposta molto bella, grazie. – EGurelli

1

È possibile impostare delle impostazioni fly mail:

Config::set('mail.encryption','ssl'); 
Config::set('mail.host','smtps.example.com'); 
Config::set('mail.port','465'); 
Config::set('mail.username','[email protected]'); 
Config::set('mail.password','password'); 
Config::set('mail.from', ['address' => '[email protected]' , 'name' => 'Your Name here']); 

Forse è possibile memorizzare i valori delle impostazioni in config/customMail.php e recuperarli con Config :: get ('customMail')

+1

Ma non sempre funziona, perché "$ app" potrebbe essere già definito. Quindi non influenzerà il flusso. –

+0

Probabilmente questo non funzionerà come previsto con utenti simultanei che inviano e-mail allo stesso tempo o soprattutto quando si usano code per inviare e-mail. – Yani

+0

@yani Puoi spiegare il tuo commento perché questo non funzionerà come previsto con utenti e code concorrenti? – developer34

1

Un po 'in ritardo per la festa ma volevo solo estendere la risposta accettata e buttare i miei 2 cent, nel caso in cui si salvasse qualcosa e tempo. Nel mio scenario ogni utente connesso aveva le proprie impostazioni SMTP, MA stavo inviando mail usando una coda, che ha fatto sì che le impostazioni tornassero ai valori predefiniti dopo averle impostate. Inoltre ha creato alcuni problemi di posta elettronica simultanea. In breve, il problema era

$transport = Swift_SmtpTransport::newInstance($user->getMailHost(), $user->getMailPort(), $user->getMailEncryption()); 
$transport->setUsername($user->getMailUser()); 
$transport->setPassword($user->getMailPassword()); 
$mailer = new Swift_Mailer($transport); 
Mail::setSwiftMailer($mailer); 
//until this line all good, here is where it gets tricky 

Mail::send(new CustomMailable());//this works 
Mail::queue(new CustomMailable());//this DOES NOT WORK 

Dopo alcuni momenti di tastiera bashing mi sono reso conto che la coda è in esecuzione su un processo separato e quindi Mail :: setSwiftMailer non influisce affatto. Prende semplicemente le impostazioni predefinite. Pertanto, la modifica della configurazione doveva avvenire al momento effettivo dell'invio dell'e-mail e non durante la messa in coda.

La mia soluzione era di estendere la Classe Mailable come segue.

app\Mail\ConfigurableMailable.php 

<?php 

namespace App\Mail; 

use Illuminate\Container\Container; 
use Illuminate\Contracts\Mail\Mailer; 
use Illuminate\Mail\Mailable; 
use Swift_Mailer; 
use Swift_SmtpTransport; 

class ConfigurableMailable extends Mailable 
{ 
    /** 
    * Override Mailable functionality to support per-user mail settings 
    * 
    * @param \Illuminate\Contracts\Mail\Mailer $mailer 
    * @return void 
    */ 
    public function send(Mailer $mailer) 
    { 
     $host  = $this->user->getMailHost();//new method I added on User Model 
     $port  = $this->user->getMailPort();//new method I added on User Model 
     $security = $this->user->getMailEncryption();//new method I added on User Model 

     $transport = Swift_SmtpTransport::newInstance($host, $port, $security); 
     $transport->setUsername($this->user->getMailUser());//new method I added on User Model 
     $transport->setPassword($this->user->getMailPassword());//new method I added on User Model 
     $mailer->setSwiftMailer(new Swift_Mailer($transport)); 

     Container::getInstance()->call([$this, 'build']); 
     $mailer->send($this->buildView(), $this->buildViewData(), function ($message) { 
      $this->buildFrom($message) 
       ->buildRecipients($message) 
       ->buildSubject($message) 
       ->buildAttachments($message) 
       ->runCallbacks($message); 
     }); 
    } 
} 

E poi cambiato CustomMail di estendere ConfigurableMailable invece di Mailable:

class CustomMail extends ConfigurableMailable {}

Questo fa in modo che anche chiamando Mail::queue(new CustomMail()) effettuerà le impostazioni di posta elettronica per utente a destra prima di inviare. Ovviamente sarà necessario iniettare l'utente corrente su CustomMail ad un certo punto, ad esempio Mail::queue(new CustomMail(Auth::user()))

Anche se questa potrebbe non essere la soluzione ideale (ad esempio, se si tenta di inviare email di massa è meglio configurare il mailer una volta e non in ogni email inviata), mi piace la sua semplicità e il fatto che non abbiamo bisogno di modificare le impostazioni globali Mail o Config, solo l'istanza $mailer è interessata.

Spero che lo trovi utile!

Problemi correlati