Laravel: Envío de mails con SMTP (parte 20)

Archivos:

  • .env
  • config/mail.php
  • resources/routes/web.php

Conectar con el proveedor de correo electrónico

Laravel está configurado para conectar con ciertos proveedores que usan APIs, aunque podemos conectarnos con cualquier otro siempre que instalemos los archivos necesarios. Desde config/mail.php podemos ver toda la configuración necesaria.

La primera decisión a tomar es elegir entre API y SMTP. En el archivo mail.php está definida la variable mail_mailer y su valor por defecto es SMTP, que es el protocolo que usaremos aquí. (SMTP: Protocolo para transferencia simple de correo).

    'default' => env('MAIL_MAILER', 'smtp'

Además necesitamos las credenciales del proveedor para conectarnos por SMTP. Desde el archovo mail.php:


    'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'local_domain' => env('MAIL_EHLO_DOMAIN'),
        ],

Como vemos en este fragmento, estas variables se toman del archivo .env:

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

Mailtrap

Mailtrap es un servidor falso SMTP para pruebas. Una vez creada la cuenta en https://mailtrap.io/ (que aquí hemos creado con las credenciales de una de nuestras cuentas de Gmail) podemos encontrar los parámetros en el primer correo de prueba que encontraremos en la bandeja de entrada.

Necesitaremos el host, el puerto, el usuario, la contraseña para el archivo .env.

En mail.php vamos a encontrar los nombres de las variables para el remitente:


    'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],

En el archivo .env:

MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

Creación de mailable

Desde la consola:

    php artisan make:mail ContactanosMailable

Dentro de /app se creará uan carpeta /Mail con el archivo que acabamos de crear.

Agregamos propiedades a la clase que se extiende de Mailable.

 class ContactanosMailable extends Mailable
{
    use Queueable, SerializesModels;

    public $subject="Asunto del mail de contacto";

(...)

Más abajo encontramos que la función build() llama a una vista que vamos a renombrar, y luego a crearla:

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

En /views creamos una carpeta /emails y dentro nuestra vista llamada contactanos.blade.php. Dentro de la vista creamos el cuerpo de un archivo HTML (recordamos: en VSC basta con escribir ! y tabular). Modificamos el HTML a nuestro antojo, e incluso agregamos un estilo:

<!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>Document</title>
    <style>
        h1 {color:blue}
    </style>
</head>
<body>
    <h1>Correo Electrónico</h1>
    <p>Primer mail que mando por Laravel</p>
</body>
</html>

Ruta para el envío del mail

Vamos al archivo de rutas, en web.php, y creamos nueva ruta tipo get:

Route::get('contactanos', function() {
    //
})

E importamos dos clases a este archivo:


use App\Mail\ContactanosMailable;
use Illuminate\Support\Facades\Mail;

Vamos a generar una instancia de ContactanosMailable y acceder a la clase mail con el método to(), usando como parámetro un mail cualquiera y pasándole una clase send con el objeto creado:

Route::get('contactanos', function() {
    $correo = new ContactanosMailable;
    Mail::to("unmaildepruebaqueexista@gmail.com")->send($correo);
    return "mensaje enviado";
})

Al ir a la url de la ruta se enviará el mail de que hemos creado. Podemos ver los mails en nuestra bandeja de entrada de mailtrap.

Recursos:

Enlace de Youtube: https://www.youtube.com/watch?v=e0ynchA_sBA&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=28