This package helps you to send mails from your Laravel application from multiple email accounts.
The package supports sending queued, localized and bulk mails.
This package works for SMTP
and log
drivers.
Laravel 5 or Laravel 6.
Install the package into your Laraval application with composer:
composer require iwasherefirst2/laravel-multimail
Publish the config file:
php artisan vendor:publish --provider="IWasHereFirst2\LaravelMultiMail\MultiMailServiceProvider"
Configure your email clients in config/multimail.php
:
'emails' => [
'[email protected]' =>
[
'pass' => env('first_mail_password'),
'from' => "Max Musterman",
],
'[email protected]' =>
[
'pass' => env('second_mail_password')
],
],
Make sure to put your credentials in the .env
file, so they don't get tracked in your repository.
For each mail you may specify multiple columns:
Attribut | Functionality | required |
---|---|---|
pass |
Password of email account | yes |
username |
Username of email account, only neccessary if different from email address | no |
from |
Name that should appear in front of email | no |
provider |
Provider of email account, only necessary if mail host/encription/port is not default (see here for more) | no |
One may send a mail using \MultiMail
instead of \Mail
. The methods to
, cc
, bcc
, locale
are exactly the same as provided by the mail facade (note that locale
is only available since Laravel 5.6).
The from
method from MultiMail
needs a string of an email provided in config/multimail.php
. When using send
or queue
the mail will be send from the mail account specified in cofing/multimail.php
.
This example assumes that [email protected]
and [email protected]
have been specified in config/multimail.php
.
// Send mail from [email protected]
\MultiMail::to($user)->from('[email protected]')->send(new \App\Mail\Invitation($user));
// Send from malaccount [email protected]
\MultiMail::to($user)->from('[email protected]')->locale('en')->send(new \App\Mail\Invitation($user));
Queued mails work exactly the same as for the normal Mail facade,
i.e. they are either send explicitly be the queue
method or the mailable class implements the ShouldQueue
contract.
// Queue Mail
\MultiMail::from('[email protected]')->queue(new \App\Mail\Invitation($user));
It is of course necessary to install a queue driver.
You may set to
, cc
, bcc
, locale
and from
in your mailable class. In this case, you could reduce the basic example from above to:
// Send mail from [email protected]
\MultiMail::send(new \App\Mail\Invitation($user));
Mailable:
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($user)
{
$this->to = $user;
$this->fromMailer = '[email protected]'
$this->locale('en');
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.invitation')
->subject('Invitation mail');
}
If you wish to send from mails with different provider, then you may create another provider in the provider
array and reference it inside the emails
array:
'emails' => [
'[email protected]' =>
[
'pass' => env('first_mail_password'),
'username' => env('first_mail_username'),
'from' => "Max Musterman",
// <------ no provider given because 'default' provider is used
],
'contact@other_domain.net' =>
[
'pass' => env('second_mail_password'),
'username' => env('second_mail_username'),
'from' => "Alice Armania",
'provider' => 'new_provider', // <------ specify new provider here
],
],
'provider' => [
'default' =>
[
'host' => env('MAIL_HOST'),
'port' => env('MAIL_PORT'),
'encryption' => env('MAIL_ENCRYPTION'),
'driver' => env('MAIL_DRIVER'),
],
'new_provider' =>
[
'host' => env('MAIL_HOST_PROVIDER_B'),
'port' => env('MAIL_PORT_PROVIDER_B'),
'encryption' => env('MAIL_ENCRYPTION_PROVIDER_B'),
'driver' => env('MAIL_DRIVER_B'),
// you may also add options like `stream`, `source_ip` and `local_domain`
]'
],
For bulk messages, you may first require a mailer object. You can define a pause in seconds ($timeout) after a number of mails ($frequency) has been send.
$mailer = \MultiMail::getMailer('[email protected]' , $timeout, $frequency);
Then you can iterate through your list.
foreach($users as $user){
$mailer->send(new \App\Mail\Invitation($user));
};
You may provide default
credentials inside the email
array from config/multimail.php
:
'emails' => [
'[email protected]' =>
[
'pass' => env('first_mail_password'),
'username' => env('first_mail_username'),
'from' => "Max Musterman",
],
'[email protected]' =>
[
'pass' => env('second_mail_password'),
'username' => env('second_mail_username'),
'from' => "Alice Armania",
],
'default' =>
[
'pass' => env('MAIL_PASSWORD'),
'username' => env('MAIL_USERNAME'),
]
],
When first_mail_password
and first_mail_username
are empty, [email protected]
will use credentials specified by default
. This is useful for your local development, when you want to send all mails from one mailaccount while testing. This way you only need to specify MAIL_PASSWORD
and MAIL_USERNAME
locally.
In your production environment simply provide all credentials into your local .env
file.
Do not specify any email accounts in your local .env
. Otherwise you may risk to send testing mails to actual users.
Instead use log
driver or setup a fake mail SMTP account like mailtrap or similar services.
If you want to use a fake mail SMPT account for testing, it is not needed to specify the same credentials for any email account. Instead, simply provide a default mail account (see above Default mail account
).