sendery / symfony
Sendery symfony template email SDK
Requires
- php: ^8.3
- sendery/php: ^0.1
- symfony/mailer: ^7.4
- symfony/mime: ^7.4
Requires (Dev)
- phpunit/phpunit: ^12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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.