Tutorial

E-mail versturen met Symfony Mailer

Symfony Mailer is de standaard verzendcomponent van Symfony. Je configureert een DSN, maakt een Email-object aan en stuurt het via MailerInterface. Optioneel verwerk je de verzending asynchroon via Messenger.

Wat je nodig hebt

  • Symfony 6.x of nieuwer
  • Composer
  • Een Wesender-account en een API-key
  • Een geverifieerd verzenddomein
Symfony Laravel Node.js
1
Stap 1

Installeren

terminal
composer require symfony/mailer

De component werkt samen met symfony/mime dat automatisch mee-installeert.

2
Stap 2

MAILER_DSN instellen

Voeg de DSN toe aan je .env-bestand:

.env
MAILER_DSN=smtp://jouw-api-key:jouw-api-key@smtp.wesender.nl:587

URL-encode speciale tekens in je credentials. Gebruik smtps:// voor poort 465 (SSL). Gewone smtp:// op poort 587 gebruikt STARTTLS automatisch.

Lokaal testen zonder echt te versturen: stel MAILER_DSN=null://null in, of log naar een bestand met native://default.
3
Stap 3

Een e-mail opstellen en versturen

Injecteer MailerInterface in je service of controller:

src/Controller/WelkomstController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;

class WelkomstController extends AbstractController
{
    public function __construct(private MailerInterface $mailer) {}

    public function stuur(): Response
    {
        $email = (new Email())
            ->from('noreply@joudomein.nl')
            ->to('klant@voorbeeld.nl')
            ->subject('Welkom')
            ->html('<p>Je account is actief.</p>');

        $this->mailer->send($email);

        return new Response('Verstuurd');
    }
}
4
Stap 4

Testen met mailer:test

terminal
php bin/console mailer:test iemand@voorbeeld.nl

Dit stuurt een testbericht via het geconfigureerde transport, maar omzeilt de Messenger-bus zodat je kunt testen zonder consumer.

5
Stap 5

Async versturen met Messenger

Installeer Messenger:

terminal
composer require symfony/messenger

Route het verzendcommando in config/packages/messenger.yaml:

config/packages/messenger.yaml
framework:
    messenger:
        transports:
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
        routing:
            Symfony\Component\Mailer\Messenger\SendEmailMessage: async

Stel MESSENGER_TRANSPORT_DSN in .env in (Doctrine, Redis of een andere transport). Start daarna de consumer:

terminal
php bin/console messenger:consume async
Symfony beschouwt verzending als geslaagd zodra het transport de mail accepteert, niet bij bezorging. Vang TransportExceptionInterface om fouten af te handelen.
6
Stap 6

Foutafhandeling

gebruik
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;

try {
    $this->mailer->send($email);
} catch (TransportExceptionInterface $e) {
    $this->logger->error('Mail versturen mislukt', ['error' => $e->getMessage()]);
}