Con esta publicación se estrena una nueva sección enfocada en Laravel, y para ello empezaremos con una herramienta muy utilizada en el desarrollo, el envío de correos.

¿Qué es Mailtrap?

De acuerdo al sitio, Mailtrap es un servidor SMTP para equipos de desarrollo que desean probar, visualizar y compartir correos enviados desde entornos de desarrollo para evitar spammear a clientes reales.
Para realizar esta práctica debes ir al sitio https://mailtrap.io y registrarte, una vez dentro debes poder visualizar un panel como el siguiente:

 

Por default Laravel viene preconfigurado para trabajar con Mailtrap como servidor SMTP de pruebas, en publicaciones posteriores veremos como utilizar un servidor de correos para la fase de producción.
Por tanto para continuar debemos ir a nuestro archivo .env localizado en la raíz de nuestro proyecto y una vez allí debemos modificar los siguientes valores para poder habilitar el envío de correos.
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=USERNAME
MAIL_PASSWORD=PASSWORD
MAIL_ENCRYPTION=null
En el valor MAIL_USERNAME debemos insertar el valor USERNAME obtenido desde el panel de Mailtrap, y hacemos lo mismo para MAIL_PASSWORD, los valores deben pertenecer a la CREDENCIAL SMTP (enmarcada con rojo).
Una vez que hemos realizado la configuración, ya podemos proceder a enviar correos desde nuestra proyecto. Para este ejemplo necesitaremos crear:
  • Una ruta /enviarCorreo post
  • Una vista que llamaremos mail.blade.php
  • Un controlador que llamaremos EmailController.php
Nuestra ruta será la siguiente:
Route::post('/enviarCorreo', 'EmailController@enviarCorreo');
Nuestra vista será la siguiente:
<html>
<head></head>
<body style="background: lightseagreen; color: snow;">
<div style="text-align: center">
    <h1>{{$contenido}}</h1>
</div>
</body>
</html>
Y la lógica de nuestro controlador será así:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class EmailController extends Controller
{
    public function enviarCorreo(Request $request)
    {
        /** Obtenemos los parametros */
        $asunto = $request->asunto;
        $contenido = $request->contenido;
        $adjunto = $request->file('adjunto');

        /**
         * El primer parametro es nuestra vista
         * El segundo parametro son los valores a inyectar en la vista
         * El tercer parametro es la instancia que define los métodos necesarios para el envío del correo
         * use() nos permite introducir valores dentro del closure para ser utilizadas por la instancia
         */
        Mail::send('email', ['contenido' => $contenido], function ($mail) use ($asunto, $adjunto) {
            $mail->from('no-reply@miapp.com', 'Bot de correos');
            $mail->to('ejemplo@mail.com');
            $mail->subject($asunto);
            $mail->attach($adjunto);
        });

        /** Respondemos con status OK */
        return response()->json(['status' => 200, 'message' => 'Envío exitoso']);
    }
}
Debido al middleware VerifyCsrfToken.php debes añadir la ruta ‘/enviarCorreo’ a la variable protegida $except, la cual excluye la validación del token para las rutas definidas, como se muestra a continuación:
class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        '/enviarCorreo'
    ];
}
Esto solo es aplicable si no vas a enviar los datos desde un formulario dentro de la misma aplicación, donde si podrías incluir el token para validar la petición.
A continuación se muestra la configuración de Postman para probar el envío de correos:

La bandeja de Mailtrap con los correos recibidos:

La instancia Mail es una instancia del facade Mail que Laravel provee, para mayor información puedes revisar la documentación: https://laravel.com/docs/5.5/mail.
Si tienes alguna duda o aclaración siéntete libre de escribirlo en los comentarios.

Leave a Reply