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

Lito @lito

Joined:
May 12, 2017

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

Publish Date: Oct 17 '20
10 0

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!

Comments 0 total

    Add comment