Cómo enviar emails en Yii2 usando SMTP

You are viewing revision #1 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version.

next (#2) »

  1. Configuración
  2. Enviar emails

View in english

Enviar emails en Yii2 es bastante sencillo, ya que usa Swiftmailer para tal propósito.

Configuración

n el archivo de configuración sólo agregue (Si usó composer para crear el proyecto muy probablemente ya tiene las siguientes líneas):

'components' => [
     ...
     'mail' => [
         'class' => 'yii\swiftmailer\Mailer',
         'transport' => [
             'class' => 'Swift_SmtpTransport',
             'host' => 'localhost',  // ej. smtp.mandrillapp.com o smtp.gmail.com
             'username' => 'username',
             'password' => 'password',
             'port' => '587', // El puerto 25 es un puerto común también
             'encryption' => 'tls', // Es usado también a menudo, revise la configuración del servidor
         ],
     ],
     ...
 ],
Plugins

Si desea usar un Plugin de Swiftmailer (por cierto, muy útiles), puede hacerlo desde el archivo de configuración también. Algo como lo siguiente funcionará:

'transport' => [
     'class' => 'Swift_SmtpTransport',
     ...
     'plugins' => [
         [
             'class' => 'Swift_Plugins_ThrottlerPlugin',
             'constructArgs' => [20],
         ],
     ],
 ],

Enviar emails

Use el siguiente código para enviar emails desde su aplicación:

Yii::$app->mail->compose()
     ->setFrom('alguien@dominio.com')
     ->setTo('email@suservidor.com')
     ->setSubject('Email enviado desde Yii2-Swiftmailer')
     ->send();
Plantillas de email avanzadas

En algunos casos, es necesario usar plantillas para generar los emails, en tal caso, sólo necesita hacer algo como lo siguiente:

Yii::$app->mail->compose('@app/mail-templates/email01', [/* Algunos parámetros para la vista */])
     ->setFrom('desde@dominio.com')
     ->setTo('email@servidor.com')
     ->setSubject('Email avanzado desde Yii2-SwiftMailer')
     ->send();

O, si desea utilizar una plantilla para HTML y otra para emails de texto, puede hacer algo como:

Yii::$app->mail->compose(['html' => '@app/mail-templates/html-email-01', 'text' => '@app/mail-templates/text-email-01'], [/* Parámetros para la vista */])
     ->setFrom('desde@dominio.com')
     ->setTo('email@servidor.com')
     ->setSubject('Email avanzado desde Yii2-SwiftMailer')
     ->send();

Note que la ruta de la vista puede ser relativa también, tal y como lo haría en un controlador (e.g. ['html' => 'html-email-01']).