laravel-mail-export
                                
                                 laravel-mail-export copied to clipboard
                                
                                    laravel-mail-export copied to clipboard
                            
                            
                            
                        A simple mailable trait and interface to export mails to a storage disk once being sent.
Laravel Mail Export
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.
Installation
You can install the package via composer:
For Laravel 9.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
Publishing the config file
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 the- MAIL_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.
Usage
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);
    }
}
Testing
Run the tests with:
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Credits
- themsaid and Spatie's laravel-mail-preview for some inspiration
- Laravel Package Development documentation by John Braun
- Pod Point
- All Contributors
License
The MIT License (MIT). Please see License File for more information.
Travel shouldn't damage the earth 🌍
Made with ❤️ at Pod Point