Prerequisites

To get the most out of this guide, you will need to:

1. Install

Get the Resend Mailer Bridge package.

Composer
composer require symfony/resend-mailer

If your application relies on Resend webhook events, you should also install the Symfony Webhook Component.

Composer
composer require symfony/webhook

2. Configuring Mailer

In your .env.local file, which you can create if needed, add the following:

MAILER_DSN=resend+api://API_KEY@default
MAILER_RESEND_SECRET=SIGNING_SECRET

Replace API_KEY with your Resend API key, and SIGNING_SECRET with your webhook secret, which can be retrieved from the Resend dashboard after creating a new webhook endpoint (see below).

3. Send your first email

In a controller, inject the Mailer:

public function __construct(
    private readonly MailerInterface $mailer,
) {
}

In a controller action, use the $this->mailer to send your email:

$this->mailer->send(
    (new Email())
        ->from('Acme <onboarding@resend.dev>')
        ->to('delivered@resend.dev')
        ->subject('Hello world')
        ->html('<strong>it works!</strong>')
);

Learn more about sending emails with Mailer Component in Symfony’s documentation.

4. Receive and handle webhooks

Thanks to the Webhook Component, you can create a webhook listener.

src/Webhook/ResendWebhookListener.php
#[AsRemoteEventConsumer('mailer_resend')]
readonly class ResendWebhookListener implements ConsumerInterface
{
    public function __construct(
        #[Autowire(param: 'kernel.project_dir')] private string $projectDir,
    ) {
    }

    public function consume(RemoteEvent $event): void
    {
        if ($event instanceof MailerDeliveryEvent) {
            $this->handleMailDelivery($event);
        } elseif ($event instanceof MailerEngagementEvent) {
            $this->handleMailEngagement($event);
        } else {
            // This is not an email event
            return;
        }
    }

    private function handleMailDelivery(MailerDeliveryEvent $event): void
    {
        // Todo
    }

    private function handleMailEngagement(MailerEngagementEvent $event): void
    {
        // Todo
    }
}

Bind your listener to the Webhook routing config:

config/packages/webhook.yaml
framework:
  webhook:
    routing:
      mailer_resend:
        service: 'mailer.webhook.request_parser.resend'
        secret: '%env(MAILER_RESEND_SECRET)%'

Next, register your application’s webhook endpoint URL (example: https://{app_domain}/webhook/mailer_resend) in the Resend Dashboard:

5. Try it yourself

Symfony Example

See the full source code.