dreamcampaigns/managesend-bundle
Installation:
composer require dreamcampaigns/managesend-bundle
Register the bundle in config/bundles.php (Symfony 4+):
return [
// ...
Managesend\ApiBundle\ManagesendApiBundle::class => ['all' => true],
];
Configuration:
Add your API credentials to config/packages/managesend_api.yaml:
managesend_api:
api_key: '%env(MANAGESEND_API_KEY)%'
api_secret: '%env(MANAGESEND_API_SECRET)%'
client_id: '%env(MANAGESEND_CLIENT_ID)%' # Optional
timeout: 60
First Use Case:
Inject the ManagesendApi service into a controller or service:
use Managesend\ApiBundle\Service\ManagesendApi;
class EmailController extends AbstractController
{
public function __construct(private ManagesendApi $managesend)
{
}
public function sendEmail()
{
$response = $this->managesend->sendEmail([
'to' => ['email@example.com'],
'subject' => 'Test Email',
'html' => '<p>Hello, world!</p>',
]);
return new JsonResponse($response);
}
}
Email Management:
$this->managesend->sendEmail([
'to' => ['recipient1@example.com', 'recipient2@example.com'],
'subject' => 'Welcome',
'html' => '<h1>Welcome!</h1>',
'text' => 'Plain text fallback',
]);
// Save a template
$this->managesend->saveTemplate('welcome_email', [
'subject' => 'Welcome',
'html' => '<p>Welcome, {{name}}!</p>',
]);
// Send using template
$this->managesend->sendTemplate('welcome_email', ['name' => 'John']);
Contact Management:
$this->managesend->addContact([
'email' => 'user@example.com',
'first_name' => 'John',
'last_name' => 'Doe',
'custom_fields' => ['membership_level' => 'premium'],
]);
$this->managesend->addContactToList('newsletter', 'user@example.com');
Campaigns:
$this->managesend->triggerCampaign('welcome_series', ['user@example.com']);
Event Listeners:
Use Symfony events to sync contacts or campaigns with your app’s lifecycle (e.g., onUserRegistered).
// src/EventListener/ManagesendSyncListener.php
public function onUserRegistered(UserRegisteredEvent $event)
{
$this->managesend->addContact([
'email' => $event->getUser()->getEmail(),
'first_name' => $event->getUser()->getFirstName(),
]);
}
Batch Operations: For large datasets, use chunking to avoid API rate limits:
$contacts = $this->contactRepository->findAll();
array_chunk($contacts, 50, function ($chunk) {
foreach ($chunk as $contact) {
$this->managesend->addContact($contact->toArray());
}
});
Error Handling:
Wrap API calls in try-catch blocks to handle ManagesendApiException:
try {
$response = $this->managesend->sendEmail($data);
} catch (ManagesendApiException $e) {
$this->logger->error('Managesend API error: ' . $e->getMessage());
// Retry logic or fallback
}
API Rate Limits:
429 Too Many Requests and handle accordingly.Configuration Overrides:
%env() or parameter bags for secrets.config/packages/managesend_api.yaml exists before use (Symfony may skip missing configs silently).Deprecated Methods:
managesend-php library may change. Check its changelog for breaking changes.Async Operations:
Enable API Debugging:
Set debug: true in config to log raw API requests/responses:
managesend_api:
debug: true
Logs appear in var/log/dev.log.
Common Errors:
Invalid API Key: Double-check api_key and api_secret in config.Missing Required Field: Validate payloads against DreamCampaigns API docs.Timeout: Increase timeout in config or optimize payload size.Custom Responses:
Extend the ManagesendApi service to transform responses:
// src/Service/CustomManagesendApi.php
class CustomManagesendApi extends ManagesendApi
{
public function sendEmail(array $data)
{
$response = parent::sendEmail($data);
return $this->formatResponse($response);
}
private function formatResponse(array $response): array
{
// Custom logic (e.g., add metadata)
return array_merge($response, ['processed_at' => now()->toAtomString()]);
}
}
Override the service in config/services.yaml:
services:
Managesend\ApiBundle\Service\ManagesendApi: '@custom_managesend_api'
Webhook Handling:
Use Symfony’s HttpKernel to validate and process DreamCampaigns webhooks:
// src/Controller/ManagesendWebhookController.php
public function handleWebhook(Request $request, ManagesendApi $managesend)
{
$payload = json_decode($request->getContent(), true);
$signature = $request->headers->get('X-Managesend-Signature');
if (!$managesend->validateWebhook($payload, $signature)) {
throw $this->createAccessDeniedException();
}
// Process event (e.g., 'contact.created')
$this->eventDispatcher->dispatch(new ManagesendWebhookEvent($payload));
}
Testing:
Mock the ManagesendApi service in PHPUnit:
$this->mockBuilder->getContainer()
->andReturn(self::createMock(ManagesendApi::class), argumentThat(function ($service) {
return $service instanceof ManagesendApi;
}));
How can I help you explore Laravel packages today?