Warning: You are browsing the documentation for version 5.0 which is not maintained anymore.
If some of your projects are still using this version, consider upgrading.
Table of Contents
The Mailer component helps sending emails.
If you're using the Symfony Framework, read the Symfony Framework Mailer documentation.
$ composer require symfony/mailer
If you install this component outside of a Symfony application, you must
vendor/autoload.php file in your code to enable the class
autoloading mechanism provided by Composer. Read
this article for more details.
The Mailer component has two main classes: a
Transport and the
1 2 3 4 5 6
use Symfony\Component\Mailer\Mailer; use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport; $transport = new EsmtpTransport('localhost'); $mailer = new Mailer($transport); $mailer->send($email);
The only transport that comes pre-installed is SMTP.
Below is the list of other popular providers with built-in support:
For example, suppose you want to use Google's Gmail SMTP server. First, install it:
$ composer require symfony/google-mailer
Then, use the SMTP Gmail transport:
1 2 3 4 5 6
use Symfony\Component\Mailer\Bridge\Google\Transport\GmailSmtpTransport; use Symfony\Component\Mailer\Mailer; $transport = new GmailSmtpTransport('user', 'pass'); $mailer = new Mailer($transport); $mailer->send($email);
Each provider provides up to 3 transports: standard SMTP, HTTP (it uses the provider's API but the body is created by the mailer component), API (it uses the full API of the provider with no control over the body creation -- features might be limited as well).
The mailer component provides a convenient way to create a transport from a DSN:
1 2 3
use Symfony\Component\Mailer\Transport; $transport = Transport::fromDsn($dsn);
$dsn depends on the provider you want to use. For plain SMTP, use
smtp://user:[email protected] or
sendmail+smtp://default to use the
sendmail binary. To disable the transport, use
For third-party providers, refer to the following table:
If your credentials contain special characters, you must URL-encode them.
For example, the DSN
ses+smtp://ABC1234:abc+12/[email protected] should be
Instead of choosing a specific protocol, you can also let Symfony pick the
best one by omitting it from the scheme: for instance,
is equivalent to
If you want to override the default host for a provider (to debug an issue using
a service like
default by your host:
Note that the protocol is always HTTPs and cannot be changed.
Symfony's mailer supports high availability via a technique called "failover" to ensure that emails are sent even if one mailer server fails .
A failover transport is configured with two or more transports and the
The mailer will start using the first transport. If the sending fails, the mailer won't retry it with the other transports, but it will switch to the next transport automatically for the following deliveries.
Symfony's mailer supports load balancing via a technique called "round-robin" to distribute the mailing workload across multiple transports .
A round-robin transport is configured with two or more transports and the
The mailer will start using the first transport and if it fails, it will retry the same delivery with the next transports until one of them succeeds (or until all of them fail).
If you want to send emails asynchronously, install the Messenger component.
$ composer require symfony/messenger
Then, instantiate and pass a
MessageBus as a second argument to
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mailer\Mailer; use Symfony\Component\Mailer\Messenger\MessageHandler; use Symfony\Component\Mailer\Messenger\SendEmailMessage; use Symfony\Component\Mailer\Transport; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Mime\Address; $dsn = 'change-dsn-accordingly'; $transport = Transport::fromDsn($dsn); $handler = new MessageHandler($transport); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([ SendEmailMessage::class => [$handler], ])), ]); $mailer = new Mailer($transport, $bus); $mailer->send($email); // you can pass an optional Envelope $mailer->send($email, new Envelope( new Address('[email protected]'), [ new Address('[email protected]'), ] ));