Como enviar un e-mail utilizando eventos en Laravel

Los eventos y escuchadores de Laravel.

De acuerdo con la documentacion oficial de Laravel, 

"Los eventos de Laravel proporcionan una implementación de observador simple, lo que permite suscribirse y escuchar diversos eventos que ocurren en tu aplicación. Las clases de eventos normalmente se almacenan en el directorio app/Events, mientras que tus oyentes se almacenan en app/Listeners.

 

¿Que puedes hacer? 

Los eventos sirven como una excelente manera de desacoplar varios aspectos de tu aplicación, ya que un solo evento puede tener múltiples oyentes que no dependen entre sí. Por ejemplo, es posible que desees enviar una notificación de Slack a tu usuario cada vez que se envíe un pedido. En lugar de acoplar tu código de procesamiento de pedidos a tu código de notificación Slack, puedes generar un evento OrderShipped, que un oyente puede recibir y transformar en una notificación Slack.


En este tutorial crearemos un evento y un escuchador, los cuales nos servirán para enviar un email mediante la ejecución de un evento.

Lo primero que haremos será configurar nuestro archivo .env para envío de correos.

MAIL_DRIVER=smtp
MAIL_HOST=servidor smtp
MAIL_PORT=puerto
MAIL_USERNAME=tu-email@domain.co
MAIL_PASSWORD=*******
MAIL_ENCRYPTION=tls

Está información no las proporciona nuestro proveedor de correos.

Ahora configuraremos el archivo config/mail.php con las mismas configuraciones.

'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'servidor smtp'), 
'port' => env('MAIL_PORT', puerto),
'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'tu-email@domain.co'),
        'name' => env('MAIL_FROM_NAME', 'nombre'),
    ],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME','username'),
 'password' => env('MAIL_PASSWORD''*********'),

El siguiente paso es modificar App/Providers/EventServicesProviders

Con el nombre de tu evento, y un escuchador. El escuchador, como su nombre lo dice: se encargará de escuchar cuando el evento sea llamado y ejecutará alguna acción que le indiquemos (Como enviar un correo o hacer una insercion en nuestra base de datos).

   protected $listen = [
        'App\Events\UserHasContacted' => [
            'App\Listeners\SendEmail',
        ],
    ];

En este caso el evento se llama UserHasContacted y nuestro escuchador se llama SendEmail.

Posteriormente debemos ejecutar el siguiente comando:

php artisan event:generate

Notaremos que se creará una carpeta llamada Events y nuestro evento UserHasContated.

También se creará una carpeta llamada Listeners y nuestro escuchador SendEmail

Los eventos se encuentran en el directorio App/Events y los escuchadores en App/Listeners

En nuestro evento UserHasContacted, en nuestra clase UserHasContacted crearemos una variable, para saber el nombre de la persona a la cual se enviará el email. Por supuesto, una mas para su correo electrónico, una para el telefono y una para escribir mensaje.

    public $name;
    public $email;
    public $phone;
    public $menssage; 

Lo que resta es inicializar nuestras variables en el constructor de la clase:

     public function __construct($name,$email,$phone,$message)
    {
        $this->$name = $name;
        $this->$email = $email;
        $this->$phone = $phone;
        $this->$message = $message;
    }

Ahora en nuestro escuchador SendEmail modificaremos la función handle:

 public function handle(UserHasContacted $event)
    {
        Mail::to('nuestroEmail@gmail.com')->queue(
            new Contact($event->name, $event->email, $event->phone, $event->message)
        );
   }

Sin olvidar importar la clase Contact en nuestro archivo SendEmail.php:

use App\Mail\Contact;

Procederemos a crear nuestro email (Contact) con el siguiente comando:

php artisan make:mail Contact  

El constructor de nuestro archivo  Mail\Contact.php queda de la siguiente manera.

    public $name;
    public $email;
    public $phone;
    public $message;
    public function __construct($name, $email, $phone, $message)
    {
        $this->name = $name;
        $this->email = $email;
        $this->phone = $phone;
        $this->message = $message;
    }

 Posteriormente, modificaremos nuestra función built().

    public function build()
    {
        return $this->markdown('emails.contact')
            ->from('email@gmail.com', 'Equipo Visión Código')
            ->subject('Correo para ' . config('app.name'));
    }

donde :

  • From: Es el email del cual se enviará el correo (previamente configurado al inicio del post).
  • subject: El asunto el cuál llevará el correo.
  • markdown(): Se indica la vista la cual será enviada 

Ahora crearemos la vista que se enviará por correo. (resourses/views/emails/contact.blade.php), la cual nos mostrará la información que hemos enviado a través del evento.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Nuevo contacto</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
        integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>

<body>
    <div class="container">
        <div class="row ">
            <div class="col-6 align-self-center">
                <div class="card">
                    <div class="card-header">
                        <div class="card-title">
                            <h4> ¡Hola, tienes un nuevo correo! </h4>
                        </div>
                    </div>
                    <div class="card-body">
                        <p> <strong> Nombre:</strong> {{$name}}</p>
                        <p><strong>Email: </strong> {{$email}}</p>
                        <p><strong>Mensaje: </strong> {{$message}}</p>
                        <p><strong>Telefono: </strong> {{$phone}}</p>
                    </div>
                </div>
            </div>

        </div>
    </div>


</body>

</html>

Finalmente podemos activar nuestro evento desde cualquier controlador que lo deseé, utilizando la función dispatch

use App\Events\UserHasContacted; #Importar el evento 
public function sendContact(Request $request) {
      UserHasContacted::dispatch($request->name, $request->email, $request->phone, $request->message);
     return back();
    }

Este ha sido un ejemplo sencillo. Se pueden implementar muchas más funcionalidades, todo depende de tus necesidades y tu imaginación.

Pero debemos recordar que tenemos a nuestra disposición la documentación oficial de laravel.

Gracias por leer este pequeño ejemplo. Si tienes alguna pregunta o sugerencia, no dudes en dejarla en los comentarios, me gustaría saber tu opinión.

    


SOBRE EL AUTOR
Javi Zamora
Javi Zamora

Hola soy Javier creador de Visión Código con la intención de ayudar a los nuevos jovenes programadores con pequeños tutoriales que te salvan la vida.