spatie/laravel-mailcoach-sdk
Laravel SDK for the Mailcoach API (self-hosted v6+ and Mailcoach Cloud). Manage email lists, subscribers and campaigns, create and send campaigns, send test emails, and easily iterate paginated API resources with next().
composer require spatie/laravel-mailcoach-sdk
php artisan vendor:publish --tag="mailcoach-sdk-config"
.env:
MAILCOACH_API_TOKEN=your_api_token_here
MAILCOACH_API_ENDPOINT=https://your-mailcoach-instance.com/api
use Spatie\MailcoachSdk\Facades\Mailcoach;
$lists = Mailcoach::emailLists();
foreach ($lists as $list) {
echo $list->name;
}
Spatie\MailcoachSdk\Facades\Mailcoach (primary entry point).EmailList, Subscriber, Campaign (for detailed operations).next(), results() for handling large datasets.$list = Mailcoach::createEmailList(['name' => 'Newsletter']);
$list->name = 'Updated Newsletter';
$list->save();
$subscribers = Mailcoach::emailList('list-uuid')->subscribers();
foreach ($subscribers as $subscriber) {
if ($subscriber->email->endsWith('@gmail.com')) {
$subscriber->unsubscribe();
}
}
$campaign = Mailcoach::createCampaign([
'email_list_uuid' => 'list-uuid',
'template_uuid' => 'template-uuid',
'fields' => ['title' => 'Hello!'],
]);
$campaign->sendTest('test@example.com'); // Test before full send
$campaign->send(); // Trigger full campaign
$activeSubscribers = Mailcoach::emailList('list-uuid')
->subscribers(['filter[status]=active']);
$subscribers = Mailcoach::emailList('list-uuid')->subscribers();
while ($subscribers->next()) {
foreach ($subscribers as $subscriber) {
// Process subscriber
}
}
Campaign::sent or Subscriber::confirmed via Mailcoach webhooks.dispatch(new SyncSubscribersJob($emailListUuid));
Mailcoach::withOptions(['timeout' => 30]) for long-running tasks.Pagination Quirks:
next() returns null before looping (avoid infinite loops).total() to estimate processing time for large datasets.API Token Security:
.env or vault.Subscriber State:
unsubscribe() only works on confirmed subscribers. Use confirm() first if needed.Template Fields:
createCampaign() must match the template’s placeholders exactly (case-sensitive).try-catch:
try {
$campaign->send();
} catch (\Spatie\MailcoachSdk\Exceptions\MailcoachException $e) {
Log::error($e->getMessage(), ['response' => $e->getResponse()]);
}
Mailcoach::fake() in tests:
Mailcoach::fake();
$campaign = Mailcoach::createCampaign([...]);
$campaign->send();
Mailcoach::assertSent('campaign-uuid');
Custom Resources:
Extend Spatie\MailcoachSdk\Resources\Resource to add domain-specific fields:
class CustomSubscriber extends Resource {
public function getCustomAttribute() { ... }
}
Middleware:
Add request/response filters via Mailcoach::extend():
Mailcoach::extend(function ($mailcoach) {
$mailcoach->onRequest(function ($request) {
$request->headers->set('X-Custom-Header', 'value');
});
});
Webhook Handling:
Use Laravel’s HandleIncomingWebhook trait to validate and process Mailcoach webhooks:
class MailcoachWebhookHandler extends HandlesWebhooks {
protected $signingKey = 'your_webhook_signing_key';
}
updateSubscribers()) for >100 subscribers.emailLists() or campaigns() if rarely updated:
Cache::remember('mailcoach_lists', now()->addHours(1), function () {
return Mailcoach::emailLists();
});
How can I help you explore Laravel packages today?