Cómo enviar emails usando SMTP

  1. Configuración
  2. Enviar emails desde la Aplicación

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 desde la Aplicación

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