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
Installeren
composer require symfony/mailer De component werkt samen met symfony/mime dat automatisch mee-installeert.
MAILER_DSN instellen
Voeg de DSN toe aan je .env-bestand:
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.
MAILER_DSN=null://null in, of log naar een bestand met native://default. Een e-mail opstellen en versturen
Injecteer MailerInterface in je service of controller:
<?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');
}
} Testen met mailer:test
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.
Async versturen met Messenger
Installeer Messenger:
composer require symfony/messenger Route het verzendcommando in 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:
php bin/console messenger:consume async TransportExceptionInterface om fouten af te handelen. Foutafhandeling
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
try {
$this->mailer->send($email);
} catch (TransportExceptionInterface $e) {
$this->logger->error('Mail versturen mislukt', ['error' => $e->getMessage()]);
} Verder bouwen
Klaar om te beginnen?
3.000 e-mails per maand gratis. Data in Europese datacenters.