# Symfony - Mailer
###### tags: `Symfony` `gobelins`
Plusieurs façon d'envoyer un mail :
- Utilisation de **Swift Mailer** --> version antérieur (créer en 2009)
- Utilisation de **Mailer** --> 2019
Notre choix : **Mailer**
- Codebase moderne
- Structure de classe + simple
- Meilleur intégration de Twig
- Intégration pièces jointes et images
## Etapes principales
### Installation
> composer require symfony/mailer
### Configuration
Différents protocoles :
- SMTP
- HTTP
- API
Pour configurer il faut changer le DSN du fichier .env :
> MAILER_DSN=gmail+smtp://USERNAME:PASSWORD@default
Le password correspond au mot de passe de l'application
### Création & envoi de l'email
Il faut créer un Maileur Contrôleur
``` php
// src/Controller/MailerController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
class MailerController extends AbstractController
{
/**
* @Route("/email")
*/
public function sendEmail(MailerInterface $mailer)
{
$email = (new Email())
->from('hello@example.com')
->to('you@example.com')
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject('Time for Symfony Mailer!')
->text('Sending emails is fun again!')
->html('<p>See Twig integration for better HTML integration!</p>');
$mailer->send($email);
// ...
}
}
```
### Pour aller plus loin
Ajout d'un header au mail
``` php
$email = (new Email())
->getHeaders()
// this header tells auto-repliers ("email holiday mode") to not
// reply to this message because it's an automated email
->addTextHeader('X-Auto-Response-Suppress', 'OOF, DR, RN, NRN, AutoReply');
// ...
;
```
Ajout de pièces jointes
``` php
$email = (new Email())
// ...
->attachFromPath('/path/to/documents/terms-of-use.pdf')
// optionally you can tell email clients to display a custom name for the file
->attachFromPath('/path/to/documents/privacy.pdf', 'Privacy Policy')
// optionally you can provide an explicit MIME type (otherwise it's guessed)
->attachFromPath('/path/to/documents/contract.doc', 'Contract', 'application/msword')
;
```
Ajout d'images
``` php
$email = (new Email())
// ...
// get the image contents from a PHP resource
->embed(fopen('/path/to/images/logo.png', 'r'), 'logo')
// get the image contents from an existing file
->embedFromPath('/path/to/images/signature.gif', 'footer-signature')
;
```
Gestion des erreurs
``` php
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
$email = new Email();
// ...
try {
$mailer->send($email);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
}
```
Gestion du style / templating
``` php
// path of the Twig template to render
->htmlTemplate('emails/signup.html.twig')
```
le template :
``` twig
{# templates/emails/signup.html.twig #}
<h1>Welcome {{ email.toName }}!</h1>
<p>
You signed up as {{ username }} the following email:
</p>
<p><code>{{ email.to[0].address }}</code></p>
<p>
<a href="#">Click here to activate your account</a>
(this link is valid until {{ expiration_date|date('F jS') }})
</p>
```