pod-point / laravel-mail-export
A mailable trait to export mails to a storage disk once being sent
Installs: 32 318
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 9
Forks: 2
Open Issues: 1
Requires
- php: ^8.1
- illuminate/filesystem: ^9.0|^10.0|^11.0
- illuminate/mail: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
- nesbot/carbon: ^2.0
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0|^9.0
README
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, 10.x, 11.x (requires PHP version 8.2 or higher)
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 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.
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