Installation:
composer require ekyna/mailing-bundle
php bin/console ekyna:mailing:install
config/bundles.php (Symfony 4+).Database Migration:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
ekyna_mailing tables (mailing, mailing_list, subscriber).First Use Case:
$list = $mailingManager->createList('Newsletter', 'newsletter@example.com');
$subscriber = $mailingManager->createSubscriber('john@example.com', 'John Doe');
$list->addSubscriber($subscriber);
$mailing = $mailingManager->createMailing($list, 'Welcome', 'welcome_template');
$mailingManager->send($mailing);
config/packages/ekyna_mailing.yaml (default config).src/Ekyna/MailingBundle/Manager/MailingManager.php (core logic).templates/ekyna_mailing/ (default Twig templates).Campaign Management:
$mailing = $mailingManager->createMailing($list, 'Subject', 'template_name', ['var' => 'value']);
$mailingManager->update($mailing);
$mailing->setSendAt(new \DateTime('+1 day'));
$mailingManager->schedule($mailing);
Subscriber Segmentation:
$subscribers = $mailingManager->getSubscribersByList($listId, ['active' => true]);
Template Integration:
templates/ekyna_mailing/mailing/ (override defaults).{# templates/ekyna_mailing/mailing/welcome.html.twig #}
<p>Hello {{ subscriber.name }}!</p>
Bulk Actions:
php bin/console ekyna:mailing:import-subscribers path/to/file.csv
Symfony Events:
Listen to ekyna.mailing.mailing.sent to log analytics:
// config/services.yaml
Ekyna\MailingBundle\EventListener\MailingListener:
tags:
- { name: kernel.event_listener, event: ekyna.mailing.mailing.sent, method: onMailingSent }
Swiftmailer Integration:
Configure transport in config/packages/ekyna_mailing.yaml:
ekyna_mailing:
transport: 'gmail'
username: 'your@gmail.com'
password: 'app_%env(MAIL_PASSWORD)%'
API Layer: Expose endpoints via API Platform or custom controllers:
#[Route('/api/mailings', methods: ['POST'])]
public function createMailing(MailingManager $manager, Request $request): Mailing
{
$data = json_decode($request->getContent(), true);
return $manager->createMailing($data['list_id'], $data['subject'], $data['template']);
}
Deprecated Symfony Version:
Composer\InstalledVersions conflicts manually if forced to use.Missing Features:
// Manually inject Swiftmailer attachments
$mailing->setSwiftMessage($mailer->createMessage()
->attachFromPath('/path/to/file.pdf')
);
$this->addUniqueConstraint('subscriber', ['email']);
Template Overrides:
templates/ekyna_mailing/mailing/welcome.html.twig).php bin/console cache:clear
Queue System:
* * * * * php bin/console ekyna:mailing:send-pending
Log Mailings:
Enable debug mode in config/packages/dev/ekyna_mailing.yaml:
ekyna_mailing:
debug: true
var/log/dev.log.Common Errors:
$listId matches the database.{{ subscriber.name }} must exist).Custom Subscriber Fields:
Extend the Subscriber entity:
// src/Entity/CustomSubscriber.php
#[ORM\Entity]
class CustomSubscriber extends Subscriber
{
#[ORM\Column]
private string $customField;
}
Update migrations and forms accordingly.
Event Subscribers:
Hook into lifecycle events (e.g., ekyna.mailing.subscriber.created):
// src/EventListener/CustomListener.php
class CustomListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
EkynaMailingEvents::SUBSCRIBER_CREATED => 'onSubscriberCreated',
];
}
public function onSubscriberCreated(SubscriberEvent $event): void
{
// Add logic (e.g., send welcome email)
}
}
Testing:
Use the MailingManager in tests with a test database:
public function testMailingCreation(): void
{
$list = $this->createMock(List::class);
$manager = $this->getMailingManager();
$mailing = $manager->createMailing($list, 'Test', 'test_template');
$this->assertInstanceOf(Mailing::class, $mailing);
}
How can I help you explore Laravel packages today?