In this post we will see how to send emails with Swift Mailer through Symfony.
As we mentioned in an earlier post, Symfony comes with an already integrated mailer library. And, send an email is as simple as we can see below:
1 2 3 4 | <?php public function executeSendEmail() { $this->getMailer()->composeAndSend('from@example.com', 'to@example.com', 'Subject', 'Body'); } |
Or, you can chose for compose the message and then send it with the Send() method:
1 2 3 4 5 | <?php public function executeSendEmail() { $this->getMailer()->compose('from@example.com', 'to@example.com', 'Subject', 'Body'); $this->getMailer()->send(); } |
Furthermore, if we need to add a little more of complexity like attach a file, it is as simple as we can see below:
1 2 3 4 5 6 | <?php public function executeSendEmail() { $this->getMailer()->compose('from@example.com', 'to@example.com', 'Subject', 'Body') ->attach(Swift_Attachment::fromPath('/path/to/a/file.zip')); $this->getMailer()->send(); } |
As we can observe in the previously used methods Symfony handles mailing issues with a Mailer object, which is got it with the getMailer() method, already ready to use in the controller due to that the mailer object already is part of the Symfony’s core.
Configuration
By default, the send() method tries to use the local SMTP server to send the message, but, of course, as a lot of Symfony stuff this is totally configurable.
As we mentioned previously the Mailer object is part of the Symfony’s core. These objects are automatically built, configured and handled them by the framework. All of the core objects are configurable by the factories.yml file.
The default configuration looks like:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mailer: class: sfMailer param: logging: %SF_LOGGING_ENABLED% charset: %SF_CHARSET% delivery_strategy: realtime transport: class: Swift_SmtpTransport param: host: localhost port: 25 encryption: ~ username: ~ password: ~ |
When a new application is built, the factories.yml file overwrites the default configuration with some sensitive environments variables:
1 2 3 4 5 6 7 8 9 | test: mailer: param: delivery_strategy: none dev: mailer: param: delivery_strategy: none |
The delivery_strategy option tells to the framework how to deliver the messages. By default, Symfony comes with 4 different strategies:
- realtime: The messages are delivered in real time.
- single_address: The messages are delivered to just one single email address.
- spool: The messages are stored in a queue.
- none: The messages are just ignored.
It does not matter what the strategy is, the messages are always logged them in the log and they are available in the “mailer” tab in the web debug toolbar.
Mail Transport
The emails are always send them through a transport. You can configure the transport that you want just editing the factories.yml file. The default configuration is:
1 2 3 4 5 6 7 8 | transport: class: Swift_SmtpTransport param: host: localhost port: 25 encryption: ~ username: ~ password: ~ |
We can chose between 3 different classes:
- Swift_SmtpTransport: Uses the SMTP server to send messages.
- Swift_SendmailTransport: Uses sendmail to send messages.
- Swift_MailTransport: Uses the PHP native function mail() to send the messages.
In the “Transport Types” section into the official Swift Mailer documentation we can find everything we need about the transport classes and their different parameters.
Source: Symfony’s site