Envíos de Emails en Laravel

Hablaremos sobre como enviar emails en Laravel, configuración y tipos, crearemos una clase Mail en Laravel que personalizaremos y luego enviaremos un email a partir de la misma.

Podemos configurar el envío de correos muy fácilmente en Laravel, si ya tienes un servicio que provee tu hosting o similar, lo único que debes de hacer es crear una dirección de correo con su contraseña.

A partir de aquí, debes de configurar algunos parámetros, si no los conoces porque el servidor de correos que estás empleando es de un servicio, debes de preguntar a tus proveedores de servicio; en el caso de Hostinger serían los siguientes:

config/mail.php

'smtp' => [
       'transport' => 'smtp',
       'host' => env('MAIL_HOST', 'smtp.hostinger.com'),
       'port' => env('MAIL_PORT', 465),
       'encryption' => env('MAIL_ENCRYPTION', 'ssl'),
       'username' => env('MAIL_USERNAME','<EMAIL>'),
       'password' => env('MAIL_PASSWORD',"<PASSWORD>"),
       'timeout' => null,
       'auth_mode' => null,
],

O puedes emplear un servicio de pruebas en caso de que no tengas acceso a un servidor de correos real como mailtrap:

https://mailtrap.io

En el cual, debes de ir a la página anterior, crearte una cuenta que es completamente gratuita, crear un inbox y configurar en tu proyecto.

.env

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=ec5cbede982042
MAIL_PASSWORD=********0be7

Clase Mailable

Para enviar cualquier correo, debemos de emplear una clase, al igual que ocurre cuando definimos un modelo, controlador o request, debemos de crear una clase con una estructura específica:

app\Mail\OrderShipped.php

<?php

namespace App\Mail;

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

class OrderShipped extends Mailable
{

    public $email;
    public $title;
    public $content;

    use Queueable, SerializesModels;

    public function __construct($email, $title, $content)
    {
        $this->email = $email;
        $this->title = $title;
        $this->content = $content;
    }

 
    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'Order Shipped',
        );
    }

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.subscribe',
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}

Para ello, usamos el comando de:

$ php artisan make:mail OrderShipped

El método de envelope() lo empleamos para definir el asunto, el de content() para el cuerpo del mensaje, allí especificamos la vista y el de attachments() para archivos adjuntos, el constructor es básico en las clases de PHP y se emplea para inicializar propiedades u otras tareas al momento de crear el objeto o instancia de la clase.

También definimos algunas propiedades de ejemplo como lo son el título, contenido e email, puedes crear otros o modificar los definidos según tus necesidades.

También podemos emplear un solo método para definir el asunto y contenido:

app\Mail\SubscribeEmail.php

<?php

namespace App\Mail;

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

class SubscribeEmail extends Mailable
{
    use Queueable, SerializesModels;

    public $email;
    public $title;
    public $content;

    public function __construct($email, $title, $content)
    {
        $this->email = $email;
        $this->title = $title;
        $this->content = $content;
    }

    public function build()
    {
        return $this->subject($this->title)->view('subscribe');
    }
}

Desde la misma, podemos personalizar los argumentos a recibir, como email asunto o contenido del correo y retornar una vista de blade que corresponde al cuerpo del correo; por ejemplo:

Creamos la vista que puede tener cualquier formato:

resources\views\emails\subscribe.blade.php

<p>Hi<br>
{!! $content !!}

Enviar correos de forma individual

Para enviar los correos, creamos una instancia de la siguiente manera:

Mail::to('no-reply@example.net.com')->send(new SubscribeEmail('contact@gmail.com', $title, $content));

Parámetros

No está limitado a especificar simplemente los destinatarios "to" al enviar un mensaje. Eres libre de configurar destinatarios "to", "cc" y "bcc" empleando sus respectivos métodos:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->send(new SubscribeEmail(contact@gmail.com', $title, $content));

CC y BCC/CCO

Un CC es una forma de enviar copias adicionales de un correo electrónico a otras personas "copia de carbono", mientras que BCC es lo mismo que el CC pero esta lista de destinatarios o personas permanecen ocultas, es decir, no aparecen en la firma del correo electrónico.

Enviar correos en masa

Una de las formas en las cuales podemos enviar múltiples correos en masa o lote, es la de enviar en un mismo contacto a múltiples correos, usualmente este es un caso delicado ya que, si hacemos algo como lo siguiente:

Mail::to('no-reply@example.net.com')
   ->cc(['hideemail1@gmail.com','hideemail2@gmail.com','hideemail3@gmail.com'])->send(new SubscribeEmail(contact@gmail.com', $title, $content));

El correo va a exponer todos los emails de los usuarios, situación que usualmente es un problema por la exposición de todos los correos a todos los destinatarios; en vez de emplear la opción de cc podemos emplear la opción de bcc la cual permite ocultar los destinatarios:

Mail::to('no-reply@example.net.com')
   ->bcc(['hideemail1@gmail.com','hideemail2@gmail.com','hideemail3@gmail.com'])->send(new SubscribeEmail(contact@gmail.com', $title, $content));

Ahora veremos que los emails definidos en BBC aparecen ocultos:

 

Cabecera de emails

 

Y no presentes como en la imagen anterior.

- Andrés Cruz

In english

Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos Curso y Libro Laravel 11 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2025.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.

!Cursos desde!

10$

En Udemy

Quedan 0d 05:46!


Udemy

!Cursos desde!

4$

En Academia

Ver los cursos

!Libros desde!

1$

Ver los libros
¡Hazte afiliado en Gumroad!