Search by

sendery / symfony

ncaroyannis

Sendery symfony template email SDK

v0.1.0 2026-09-27 07:18 UTC

This package is auto-updated.

Last update: 2026-09-28 01:30:24 UTC


README

Send Sendery templates through Symfony Mailer.

Documentation · API reference · Changelog

Requirements

Symfony Mailer 7.4 and PHP 8.3+ with the cURL extension.

Install

composer require sendery/symfony:^0.1

Register the transport

Publish a welcome template with name and action_url variables, and create a project API key. Add the factory to config/services.yaml.

# config/services.yaml — add to your existing services section.
services:
  Sendery\Symfony\SenderyTransportFactory:
    tags: ['mailer.transport_factory']

Set the API key

Set MAILER_DSN in .env.local or your hosting provider’s secret settings.

MAILER_DSN=sendery://YOUR_PROJECT_API_KEY@sendery.co

Configure Mailer

Use the DSN in your existing Mailer configuration.

# config/packages/mailer.yaml
framework:
  mailer:
    dsn: '%env(MAILER_DSN)%'

Send an email

Inject MailerInterface and send a TemplateEmail. Symfony requires from() for validation; Sendery uses the sender configured on your project. Use one recipient. HTML emails, attachments, and cc or bcc recipients are not supported.

use Sendery\Symfony\TemplateEmail;
use Symfony\Component\Mailer\MailerInterface;

final class WelcomeEmails
{
    public function __construct(private MailerInterface $mailer) {}

    public function send(string $address, string $name): void
    {
        $email = (new TemplateEmail())
            ->from('hello@your-domain.com')
            ->to($address)
            ->template('welcome', [
                'name' => $name,
                'action_url' => 'https://example.com/start',
            ]);

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

Send with Messenger

With Symfony Messenger and your chosen transport installed, set MESSENGER_TRANSPORT_DSN and route mail to async. Run php bin/console messenger:consume async. The same queued TemplateEmail keeps its key and variables on retries.

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

Handle failures

API failures throw TransportException with a Sendery\ApiException as the previous exception. Inspect its status and errorCode. The transport makes one attempt; configure Messenger to retry temporary failures and avoid retrying validation or billing errors.

More

See idempotency and retries for retry conditions, delays, and reusing a key across attempts.

License

MIT.