sábado, 14 de febrero de 2015

Yii Framework 2 - SwiftMailer (Envío de emails)




En este capítulo del tutorial de Yii2 veremos como enviar correos electrónicos a través de la librería integrada SwiftMailer, para el ejemplo utilizaremos el servidor smtp de gmail y el formulario de contacto que viene por defecto en la aplicación esqueleto. Modificaremos el método contact del modelo ContactForm para poder enviar el correo a través de una plantilla (layout).

Class yii\swiftmailer\Mailer: http://www.yiiframework.com/doc-2.0/yii-swiftmailer-mailer.html


Es posible que os surja un error como el siguiente al enviar el correo con vuestra cuenta de gmail ... 

Expected response code 250 but got code "535", with message "535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 u6sm5939213wix.12 - gsmtp"

Esto lo podéis solventar si váis a la siguiente dirección: https://www.google.com/settings/security/lesssecureapps y activáis la casilla para aplicaciones menos seguras.

El código que interviene en este capítulo lo podéis ver a continuación:


Código del modelo ContactForm

<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * ContactForm is the model behind the contact form.
 */
class ContactForm extends Model
{
    public $name;
    public $email;
    public $subject;
    public $body;
    public $verifyCode;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // name, email, subject and body are required
            [['name', 'email', 'subject', 'body'], 'required'],
            // email has to be a valid email address
            ['email', 'email'],
            // verifyCode needs to be entered correctly
            ['verifyCode', 'captcha'],
        ];
    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'verifyCode' => 'Verification Code',
        ];
    }

    /**
     * Sends an email to the specified email address using the information collected by this model.
     * @param  string  $email the target email address
     * @return boolean whether the model passes validation
     */
    public function contact($email)
    {
        $content = "<p>Email: " . $this->email . "</p>";
        $content .= "<p>Name: " . $this->name . "</p>";
        $content .= "<p>Subject: " . $this->subject . "</p>";
        $content .= "<p>Body: " . $this->body . "</p>";
        if ($this->validate()) {
            Yii::$app->mailer->compose("@app/mail/layouts/html", ["content" => $content])
                ->setTo($email)
                ->setFrom([$this->email => $this->name])
                ->setSubject($this->subject)
                ->setTextBody($this->body)
                ->send();

            return true;
        } else {
            return false;
        }
    }
}


Código del archivo de configuración params.php

<?php

return [
    'adminEmail' => 'tucuenta@gmail.com',
];


Código del archivo de configuración web.php

<?php

$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => '2ydHEAPUDNIBEdO9Bv2htADv-QU6C1pT',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
   'useFileTransport' => false,
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
   'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'tucuenta@gmail.com',
            'password' => 'tupassword',
            'port' => '587',
            'encryption' => 'tls',
        ],
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),
    ],
    'params' => $params,
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yii\gii\Module';
}

return $config;



Ver el vídeo tutorial de Yii Framework 2 en Youtube





1 comentario:

Lina Ocampo Cuartas dijo...

Hola!

Primero que todo quiero darte las gracias por tus tutoriales. Me han ayudado mucho.

Claro que ahora tengo un problema al seguir las indicaciones que das para el envío de correo.

stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

Sabes porque se produce?

De antemano agradezco tu ayuda.