Una forma más fácil y más legible de enviar correos electrónicos desde Laravel.

Laravel 5.3 es bastante reciente y hay un montón de nuevas características. Una de las principales mejoras es cómo enviar correos en tus aplicaciones.

Echemos un vistazo a enviar correos electrónicos. Antes de Laravel 5.3, el envío de correos electrónicos en Laravel se parecía mucho a esto.

Mail::send('emails.send', ['title' => $title, 'message' => $message], function ($message)
 {
    $message->from('no-reply@scotch.io', 'Scotch.IO');
    $message->to('batman@batcave.io');
});

Este método funcionó durante un tiempo, pero después de enviar un par de mensajes de correo electrónico. Como realmente no me gustaba este método, me encontré utilizando a los escuchadores de eventos para crear correos electrónicos.

Instalando Laravel 5.3

En el momento de este artículo, instalar Laravel 5.3 con el instalador de Laravel es tan simple como escribir la siguiente sentencia.

laravel new project

Introducción a los Mailables

Básicamente, los mailables son responsables de recopilar datos y pasarlos a las vistas. Mientras tanto, la API para enviar correos electrónicos se ha hecho muy simple.

Para enviar emails a Laravel, todo lo que tenemos que hacer ahora es.

Mail::to('batman@batcave.io')->send(new KryptoniteFound);

La API anterior funcionará bien (y seguirá funcionando en vuestras aplicaciones), solo que esta API de correo electrónico tiene un conjunto mucho más simple.

Creando un Mailable

Con el practico cli-tool, podemos crear un mailable parecido a este:

php artisan make:mail <NameOfMailable>

Dado que el nombre de nuestro mailable es KryptoniteFound, podemos crear nuestro mailable usando este comando.

php artisan make:mail KryptoniteFound

Creating a laravel 5.3 mailable

Después de haber creado nuestro mailable, en app/mail, podemos ver nuestra clase recién  creada.

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class KryptoniteFound extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct()
    {
        //
    }

    public function build()
    {
        return $this->view('view.name');
    }
}

La clase creada debe verse como el fragmento anterior.

Como podemos ver, el método de build genera el mensaje. En nuestro caso, podemos reemplazar el view.name con la ruta de acceso a nuestro correo electrónico email.kryptonite-found.

En recursos/vistas, cree una nueva plantilla en una carpeta de correo electrónico denominada kryptonite-found.blade.php.

Transmisión de datos a las vistas de correo electrónico

Cualquier propiedad pública en la clase mailable se pone automáticamente a disposición de la vista. Por lo tanto, pasar los datos a las vistas es tan simple como hacer que los datos sean públicos en la clase.

Digamos, por ejemplo, que quería pasar el peso de las kryptonitas encontradas, todo lo que tengo que hacer es exponer el total en el mailable como este.

public $total = 30;

Mientras en nuestra vista lo tenemos como una variable normal.

<h1>Woot Woot!!</h1>

<p>Alfred just found <strong>{{ $total }}lbs</strong> of kryptonite</p>

También podemos establecer datos de forma explicita usando el método with:

public function build()
{
    return $this->view('emails.kryptonite-found')
                ->with($key, $value);
}

Configurando nuestro enviador (Mailer)

Para enviar los mails usaremos mailtrap.

A continuación pasamos nuestra configuración (con las credenciales) a nuestro fichero .env

MAIL_DRIVER="smtp"
MAIL_HOST="mailtrap.io"
MAIL_PORT=2525
MAIL_USERNAME=31230cade12007610
MAIL_PASSWORD=24280ed5ee934c
MAIL_ENCRYPTION=null

Deberás reemplazar MAIL_USERNAME y MAIL_PASSWORD con tus credenciales de mailtrap.

Aún así deberemos configurar los detalles del envío. En el archivo config/mail.php hay un array para configurar las direcciones y nombres (se pueden dejar tal y como vienen por defecto), pero en ningún concepto pueden ser nulos.

Enviando parámetros extra

Podemos añadir el cc, bcc y resto de parámetros en el método build(), como se ve a continuación:

public function build()
{
    $address = 'ignore@batcave.io';
    $name = 'Ignore Me';
    $subject = 'Krytonite Found';

    return $this->view('emails.kryptonite-found')
                ->from($address, $name)
                ->cc($address, $name)
                ->bcc($address, $name)
                ->replyTo($address, $name)
                ->subject($subject);
}

Enviando Mails

Anteriormente, nuestras rutas se encontraban en app/Http/routes.php, pero con esta versión de Laravel las rutas están ahora en app/routes. Ahora podemos utilizar rutas basadas en la interfaz (web, api o consola). Para este ejemplo, sólo necesitamos el archivo de rutas web.php.

use App\Mail\KryptoniteFound;

Route::get('/', function () {
    // send an email to "batman@batcave.io"
    Mail::to('batman@batcave.io')->send(new KryptoniteFound);

    return view('welcome');
});

Ahora podemos arrancar nuestro servidor y ejecutar el siguiente comando:

php artisan serve

Podemos activar el correo visitando la siguiente dirección local http://localhost:8080.

Emails en cola

Para pone en cola los correos electrónicos simplemente se debe llamar al método queue

Mail::to('batman@batcave.io')->queue(new KryptoniteFound);

Podemos retardar el envío de la cola

Para retrasar un correo electrónico en cola, usaremos el siguiente método. Este método tiene dos parámetros.
El primero es un objeto DateTime que representa el tiempo de espera.
El segundo parámetro es el mailable.

$when = Carbon\Carbon::now()->addMinutes(10);

Mail::to('batman@batcave.io')->later($when, new KryptoniteFound);

Anuncios

Write your comment