template plantillas mail example descargar laravel laravel-4

plantillas - laravel send email smtp



configuraciones de correo mĂșltiples (4)

Aún más fácil es ejecutar el siguiente código, justo antes de enviar un correo electrónico, después de haber escrito sobre la configuración de correo con config:

app()->forgetInstance(''swift.transport''); app()->forgetInstance(''swift.mailer''); app()->forgetInstance(''mailer'');

Configuré el servicio de correo de laravel con el controlador mandril. No hay problemas aquí!

Ahora, en cierto punto de mi solicitud, necesito enviar un correo electrónico a través de gmail.

Hice algo como:

// 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);

Esto no funciona, laravel siempre usa las configuraciones de mandril. Parece que inicia el servicio de correo al inicio del script e ignora lo que haces durante la ejecución.

¿Cómo cambia las configuraciones / comportamiento del servicio de correo durante la ejecución?


Puede configurar en la configuración de correo aéreo:

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'']);

Quizás pueda almacenar los valores de configuración en config / customMail.php y recuperarlos con Config :: get (''customMail'')


Puedes crear una nueva instancia de Swift_Mailer y usar eso:

// 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);


Un poco tarde para la fiesta, pero solo quería extender la respuesta aceptada y tirar mis 2 centavos, en caso de que le ahorrara tiempo a alguien. En mi caso, cada usuario que inició sesión tenía su propia configuración de SMTP, PERO yo estaba enviando correos usando una cola, lo que causó que la configuración volviera a la configuración predeterminada después de configurarla. También creó algunos problemas de correos electrónicos concurrentes. En resumen, el 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

Después de unos instantes de golpear el teclado, me di cuenta de que la cola se está ejecutando en un proceso separado y, por lo tanto, Mail :: setSwiftMailer no lo afecta en absoluto. Simplemente recoge la configuración por defecto. Por lo tanto, el cambio de configuración tuvo que ocurrir en el momento en que se envió el correo electrónico y no al hacer la cola.

Mi solución fue extender la clase de Mailable como sigue.

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); }); } }

Y luego cambió CustomMail para extender ConfigurableMailable lugar de Mailable :

class CustomMail extends ConfigurableMailable {}

Esto asegura que incluso llamando a Mail::queue(new CustomMail()) establecerá la configuración de correo por usuario justo antes de enviar. Por supuesto, tendrá que inyectar el usuario actual en el CustomMail en algún momento, es decir, Mail::queue(new CustomMail(Auth::user()))

Si bien esta puede no ser la solución ideal (es decir, si se trata de enviar un correo electrónico masivo, es mejor configurar el correo una vez y no en cada correo electrónico enviado), me gusta su simplicidad y el hecho de que no necesitamos cambiar el Mail global o Config configuración, solo se afecta la instancia de $mailer .

¡Esperamos que te sea útil!