symkit / mailer-bundle
Symfony bundle for managing and sending MJML templates with event-driven logging and asynchronous support.
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/symkit/mailer-bundle
Requires
- php: >=8.2
- doctrine/doctrine-bundle: ^2.11
- doctrine/orm: ^3.6
- notfloran/mjml-bundle: ^3.9
- symfony/form: ^7.0 || ^8.0
- symfony/framework-bundle: ^7.0 || ^8.0
- symfony/mailer: ^7.0 || ^8.0
- symfony/uid: ^7.0 || ^8.0
- symfony/validator: ^7.0 || ^8.0
- symkit/crud-bundle: ~0.0.1
- symkit/form-bundle: ~0.0.1
Requires (Dev)
- deptrac/deptrac: ^2.0
- friendsofphp/php-cs-fixer: ^3.0
- infection/infection: ^0.29
- nyholm/symfony-bundle-test: ^3.0
- phpro/grumphp: ^2.0
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^11.0
- symkit/bundle-ai-kit: ~0.0.1
Suggests
- symfony/messenger: Pour envoi asynchrone (SendEmailMessage)
README
A Symfony bundle to manage and send emails from MJML-based templates, with event-driven logging and optional asynchronous sending via Symfony Messenger.
Requirements
- PHP 8.2+
- Symfony 7.0+ or 8.0+
- notfloran/mjml-bundle (MJML rendering)
- symkit/crud-bundle (admin UI)
- symkit/form-bundle
For asynchronous sending, install symfony/messenger (see composer suggest).
Installation
composer require symkit/mailer-bundle
Register the bundle in config/bundles.php:
return [ // ... Symkit\MailerBundle\SymkitMailerBundle::class => ['all' => true], ];
Configuration
Create or edit config/packages/symkit_mailer.yaml:
symkit_mailer: doctrine: true # Entities and repositories (disable if not using Doctrine) logging: true # Log sends to EmailLog (requires doctrine) messenger: true # Register Messenger handler for async sending (requires symfony/messenger) admin: enabled: true route_prefix: symkit_mailer_admin entity: email_class: Symkit\MailerBundle\Entity\Email email_repository_class: Symkit\MailerBundle\Repository\EmailRepository layout_class: Symkit\MailerBundle\Entity\Layout layout_repository_class: Symkit\MailerBundle\Repository\LayoutRepository email_log_class: Symkit\MailerBundle\Entity\EmailLog email_log_repository_class: Symkit\MailerBundle\Repository\EmailLogRepository
If you override entity or repository classes (e.g. with subclasses), ensure your Doctrine mapping (e.g. targetEntity on relations) stays consistent with those classes.
Admin routes
Mount the bundle routes with a prefix (e.g. under /admin/email):
# config/routes.yaml symkit_mailer_admin: resource: '@SymkitMailerBundle/config/routes.yaml' prefix: /admin/email
MJML
Configure notfloran/mjml-bundle (e.g. config/packages/mjml.yaml) and set MAILER_DSN in your .env file.
Usage
Synchronous sending
Inject Symkit\MailerBundle\Contract\EmailSenderInterface and call send() with the template slug, recipient, and Twig context:
$this->emailSender->send( 'welcome', // template slug (stored in DB) 'user@example.com', // recipient ['name' => 'John'] // Twig context );
Asynchronous sending (Messenger)
When symkit_mailer.messenger is enabled and symfony/messenger is installed, dispatch a message:
$bus->dispatch(new SendEmailMessage('welcome', 'user@example.com', ['name' => 'John']));
Events
The bundle dispatches the following events (subscribe to them for custom logging or side effects):
| Event | When | Payload (typical) |
|---|---|---|
EmailSendingEvent |
Send started | messageId, recipient, subject |
EmailSentEvent |
Send succeeded | messageId, HTML content |
EmailFailedEvent |
Send failed | messageId, error message |
When logging is enabled, EmailLogSubscriber persists these to the EmailLog entity.
Development and quality
From the bundle root:
make cs-fix # Fix code style make phpstan # Static analysis (level 9) make test # PHPUnit make deptrac # Architecture layers make quality # Full pipeline (cs-check, phpstan, deptrac, test, infection) make ci # Security check + quality
License
MIT.