DEV Community

Cover image for Como guardar una copia de cada email que se envía desde Laravel
Lito
Lito

Posted on

Como guardar una copia de cada email que se envía desde Laravel

Con este post crearemos un fichero con cada correo enviado por nuestro sistema para poder analizar el contenido de los mismos.

El post anterior sobre debug en Laravel es https://dev.to/lito/como-generar-logs-que-registren-las-consultas-a-base-de-datos-en-laravel-5edl

1. Creamos el Logger de Mail

Lo podemos dar de alta por ejemplo en app/Services/Mail/Logger.php:

<?php declare(strict_types=1);

namespace App\Services\Mail;

use Illuminate\Mail\Events\MessageSending;
use Illuminate\Support\Facades\Event;

class Logger
{
    /**
     * @return void
     */
    public static function listen(): void
    {
        Event::listen(MessageSending::class, static fn ($event) => static::store($event));
    }

    /**
     * @param \Illuminate\Mail\Events\MessageSending $event
     *
     * @return void
     */
    protected static function store(MessageSending $event): void
    {
        $file = storage_path('logs/mails/'.date('Y-m-d/H-i-s').'-'.uniqid().'.log');
        $dir = dirname($file);

        if (is_dir($dir) === false) {
            mkdir($dir, 0755, true);
        }

        file_put_contents($file, (string)$event->message);
    }
}
Enter fullscreen mode Exit fullscreen mode

Ahora podemos crear un ServiceProvider que gestione el debug. Lo haremos en app/Providers/Debug.php:

<?php declare(strict_types=1);

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\Mail\Logger as LoggerMail;

class Debug extends ServiceProvider
{
    /**
     * @return void
     */
    public function boot()
    {
        $this->logging();
    }

    /**
     * @return void
     */
    protected function logging(): void
    {
        $this->loggingMail();
    }

    /**
     * @return void
     */
    protected function loggingMail(): void
    {
        if (config('logging.channels.mail.enabled')) {
            LoggerMail::listen();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Una vez tengamos el servicio, lo añadimos en config/app.php en el array de providers:

    ...

    'providers' => [
        ...

        /*
         * Application Service Providers...
         */
        App\Providers\Debug::class,
    ],
];
Enter fullscreen mode Exit fullscreen mode

También añadimos su opción de configuración en config/logging.php:

    ...

    'channels' => [
        ...

        'mail' => [
            'enabled' => env('LOG_MAIL', false),
        ],
    ],
Enter fullscreen mode Exit fullscreen mode

Y lo completamos con el valor en .env:

LOG_MAIL=true
Enter fullscreen mode Exit fullscreen mode

De este modo nos creará una carpeta en storage/logs/mails/ con cada día y dentro un fichero cada correo ordenados por hora.

El código completo lo podeis encontrar aquí https://gist.github.com/eusonlito/773bd0ef3de74ba998e0fb6f8cc42d9a

Y ya sabes, si te ha parecido interesante, comparte!

Top comments (0)