elasticemail/elasticemail-php
PHP client for Elastic Email’s REST API. Authenticate with your API key and manage campaigns and other resources via GET/POST/PUT/DELETE. Supports PHP 7.4+ (incl. 8.0) and uses Guzzle with configurable timeouts and connection limits.
Install the Package
Add to composer.json:
"require": {
"elasticemail/elasticemail-php": "^1.0"
}
Run composer install.
Configure API Key
Set your ElasticEmail API key in config/services.php (or environment variables):
'elasticemail' => [
'api_key' => env('ELASTICEMAIL_API_KEY'),
],
Or directly in code:
$config = ElasticEmail\Configuration::getDefaultConfiguration()
->setApiKey('X-ElasticEmail-ApiKey', env('ELASTICEMAIL_API_KEY'));
First Use Case: Send a Transactional Email
$apiInstance = new ElasticEmail\Api\EmailsApi(new GuzzleHttp\Client(), $config);
$body = new \ElasticEmail\Model\SendTransactionalEmailRequest([
'from' => 'sender@example.com',
'to' => 'recipient@example.com',
'subject' => 'Test Email',
'bodyHtml' => '<h1>Hello!</h1>',
]);
$result = $apiInstance->emailsTransactionalPost($body);
examples/: Pre-built use cases (e.g., sendTransactionalEmails.php).src/Api/: API classes (e.g., CampaignsApi, ContactsApi).src/Model/: Request/response models (e.g., SendTransactionalEmailRequest).Wrap the client in a Laravel service for reusability:
// app/Services/ElasticEmailService.php
class ElasticEmailService {
protected $client;
public function __construct() {
$config = ElasticEmail\Configuration::getDefaultConfiguration()
->setApiKey('X-ElasticEmail-ApiKey', config('services.elasticemail.api_key'));
$this->client = new ElasticEmail\Api\EmailsApi(new GuzzleHttp\Client(), $config);
}
public function sendTransactional($data) {
return $this->client->emailsTransactionalPost($data);
}
}
Register in AppServiceProvider:
$this->app->singleton(ElasticEmailService::class, function ($app) {
return new ElasticEmailService();
});
// Upload CSV and send
$csv = fopen('contacts.csv', 'r');
$api = new ElasticEmail\Api\EmailsApi($client, $config);
$response = $api->emailsMergefilePost([
'file' => new \GuzzleHttp\Psr7\Stream(fopen('contacts.csv', 'r')),
'subject' => 'Bulk Campaign',
'bodyHtml' => '<p>Hello {name}!</p>',
]);
// Create and pause a campaign
$campaignApi = new ElasticEmail\Api\CampaignsApi($client, $config);
$campaignApi->campaignsPost(new \ElasticEmail\Model\AddCampaignRequest([
'name' => 'Welcome Series',
'subject' => 'Welcome!',
'bodyHtml' => '<h1>Welcome!</h1>',
'listName' => 'subscribers',
]));
$campaignApi->campaignsByNamePausePut('Welcome Series');
// Add/update contacts via API
$contactApi = new ElasticEmail\Api\ContactsApi($client, $config);
$contactApi->contactsPost(new \ElasticEmail\Model\AddContactRequest([
'email' => 'user@example.com',
'name' => 'John Doe',
'customFields' => ['signup_date' => '2023-01-01'],
]));
Use webhooks (via ElasticEmail dashboard) to trigger Laravel jobs:
// routes/web.php
Route::post('/elasticemail/webhook', [EmailWebhookHandler::class, 'handle']);
// app/Handlers/EmailWebhookHandler.php
class EmailWebhookHandler {
public function handle(Request $request) {
$event = $request->json()->all();
if ($event['type'] === 'email_sent') {
EmailSentJob::dispatch($event['data']);
}
}
}
Centralize API errors in a middleware or service:
// app/Exceptions/Handler.php
public function render($request, Throwable $exception) {
if ($exception instanceof \ElasticEmail\ApiException) {
return response()->json([
'error' => 'ElasticEmail API Error',
'details' => $exception->getResponseBody(),
], 400);
}
return parent::render($request, $exception);
}
foreach ($contacts as $contact) {
SendEmailJob::dispatch($contact);
}
$exportId = $contactApi->contactsExportPost($criteria);
while (true) {
$status = $contactApi->contactsExportByIdStatusGet($exportId);
if ($status->getStatus() === 'completed') break;
sleep(5);
}
.env:
ELASTICEMAIL_API_KEY=your_key_here
SecurityApi to generate/rotate keys programmatically:
$securityApi = new ElasticEmail\Api\SecurityApi($client, $config);
$newKey = $securityApi->securityApikeysPost(new \ElasticEmail\Model\AddApiKeyRequest([
'name' => 'Laravel App Key',
'accessLevel' => 'full_access',
]));
GuzzleHttp\Psr7\Stream for file uploads:
$file = new \GuzzleHttp\Psr7\Stream(fopen('file.csv', 'r'));
$api->contactsImportPost(['file' => $file]);
$client = new GuzzleHttp\Client([
'handler' => GuzzleHttp\HandlerStack::create(new GuzzleHttp\Handler\CurlHandler()),
'debug' => true,
]);
400 for invalid requests).$this->app->bind(ElasticEmail\Api\EmailsApi::class, function ($app) {
return new ElasticEmail\Api\EmailsApi(
new GuzzleHttp\Client(),
ElasticEmail\Configuration::getDefaultConfiguration()
->setApiKey('X-ElasticEmail-ApiKey', config('services.elasticemail.api_key'))
);
});
$mock = Mockery::mock(ElasticEmail\Api\EmailsApi::class);
$mock->shouldReceive('emailsTransactionalPost')
->once()
->andReturn(new \ElasticEmail\Model\SendTransactionalEmailResponse());
$this->app->instance(ElasticEmail\Api\EmailsApi::class, $mock);
X-ElasticEmail-Signature header.ElasticEmail\Model classes for additional validation:
class ExtendedContactRequest extends \ElasticEmail\Model\AddContactRequest {
public function setCustomFields(array $fields) {
$this->customFields = array_filter($fields, fn($v) => strlen($v) <= 100);
return $this;
}
}
use Symfony\Component\HttpClient\RetryStrategy;
$client = new GuzzleHttp\Client([
'handler' => HandlerStack::create(new RetryHandler([
'max_retries' => 3,
'delay' => 100,
'max_delay' => 1000,
])),
]);
How can I help you explore Laravel packages today?