This package can export any mail sent with Laravel's Mailable class to any desired filesystem disk and path as a .eml file.
This can be useful when wanting to store emails sent for archive purposes.
You can install the package via composer:
For Laravel 9.x and 10.x
composer require pod-point/laravel-mail-exportFor Laravel 7.x and 8.x
composer require pod-point/laravel-mail-export:^1.0For Laravel 5.x and 6.x
composer require pod-point/laravel-mail-export:^0.1The configuration for this package comes with some sensible values but you can optionally publish the config file with:
php artisan vendor:publish --provider="PodPoint\MailExport\MailExportServiceProvider"You will be able to specify:
enabled: whether this package is enabled or not. Once installed, it's enabled by default but theMAIL_EXPORTenvironment variable can be used to configure this.disk: which disk to use by default.nullwill use the default disk from your application filesystem.path: the default path, within the configured disk, where mail will be exported.
See our config/mail-export.php for more details.
Simply add the Exportable trait and the ShouldExport interface to any Mailable class that you want to persist into any storage disk.
<?php
namespace App\Mail;
use Illuminate\Mail\Mailable;
use PodPoint\MailExport\Concerns\Exportable;
use PodPoint\MailExport\Contracts\ShouldExport;
class OrderShipped extends Mailable implements ShouldExport
{
use Exportable;
// ...
}This will use the default filesystem disk and path from the configuration and will also generate a unique filename for you.
The default filename is using a timestamp, the mail recipients, the subject and will look like so:
2021_03_26_150142_jane_at_example_com_this_is_the_subject.eml
You can also specify the disk, path or filename to use for a specific Mailable using properties:
<?php
namespace App\Mail;
use Illuminate\Mail\Mailable;
use PodPoint\MailExport\Concerns\Exportable;
use PodPoint\MailExport\Contracts\ShouldExport;
class OrderShipped extends Mailable implements ShouldExport
{
use Exportable;
public $exportDisk = 'some_disk';
public $exportPath = 'some_path';
public $exportFilename = 'some_filename';
// ...
}You can also use methods if you need more flexibility:
<?php
namespace App\Mail;
use Illuminate\Mail\Mailable;
use PodPoint\MailExport\Concerns\Exportable;
use PodPoint\MailExport\Contracts\ShouldExport;
class OrderShipped extends Mailable implements ShouldExport
{
use Exportable;
// ...
public function exportDisk(): string
{
return 'some_disk';
}
public function exportPath(): string
{
return 'some_path';
}
public function exportFilename(): string
{
return 'some_filename';
}
}Then you can keep using your Mailable as usual:
Mail::to($request->user())->send(new OrderShipped($order));Even with Notifications too:
<?php
namespace App\Notifications;
use App\Mail\OrderShipped as Mailable;
use Illuminate\Notifications\Notification;
class OrderShipped extends Notification
{
// ...
public function toMail($notifiable)
{
return (new Mailable($this->order))->to($notifiable->email);
}
}Run the tests with:
composer testPlease see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
- themsaid and Spatie's laravel-mail-preview for some inspiration
- Laravel Package Development documentation by John Braun
- Pod Point
- All Contributors
The MIT License (MIT). Please see License File for more information.
Travel shouldn't damage the earth 🌍
Made with ❤️ at Pod Point