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-export
For Laravel 7.x and 8.x
composer require pod-point/laravel-mail-export:^1.0
For Laravel 5.x and 6.x
composer require pod-point/laravel-mail-export:^0.1
The 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_EXPORT
environment variable can be used to configure this.disk
: which disk to use by default.null
will 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 test
Please 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