PHPackages                             mailermine/mailermine - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. mailermine/mailermine

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

mailermine/mailermine
=====================

The official MailerMine PHP &amp; Laravel SDK for transactional email, campaigns, contacts, analytics, and webhooks.

v1.0.1(1mo ago)058↓12.5%[3 PRs](https://github.com/rahulyadav5192/mailermine-laravel-sdk/pulls)MITPHPPHP ^8.3CI passing

Since Jul 17Pushed 1mo agoCompare

[ Source](https://github.com/rahulyadav5192/mailermine-laravel-sdk)[ Packagist](https://packagist.org/packages/mailermine/mailermine)[ Docs](https://mailermine.com)[ RSS](/packages/mailermine-mailermine/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (1)Dependencies (9)Versions (3)Used By (0)

MailerMine PHP &amp; Laravel SDK
================================

[](#mailermine-php--laravel-sdk)

 The official PHP &amp; Laravel SDK for [MailerMine](https://mailermine.com) — send transactional email, run campaigns, manage contacts, and read analytics with a clean, typed, Laravel-native API.

 [![Latest Version on Packagist](https://camo.githubusercontent.com/b66139ede417c707f80e19e0eab5c7c76a3c6cbd6591ffb9b2f248c7b0713d57/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d61696c65726d696e652f6d61696c65726d696e652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/mailermine/mailermine) [![Total Downloads](https://camo.githubusercontent.com/2e234156305c19a68ca303c1039157afa113a15ad67ae79ad6e3703decf8e90b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d61696c65726d696e652f6d61696c65726d696e652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/mailermine/mailermine) [![Tests](https://camo.githubusercontent.com/eccd86eb737395eca408c0cf1ac62e3b8a3802301b9cc913eb27ac7ec4b00ffa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f726168756c7961646176353139322f6d61696c65726d696e652d6c61726176656c2d73646b2f63692e796d6c3f6272616e63683d6d61696e267374796c653d666c61742d737175617265266c6162656c3d7465737473)](https://github.com/rahulyadav5192/mailermine-laravel-sdk/actions/workflows/ci.yml) [![PHP Version](https://camo.githubusercontent.com/a1434177f0ae43dbc05caaac10da64c785eeecb728031b948d82045ece3b530b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e332d3737374242343f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/a1434177f0ae43dbc05caaac10da64c785eeecb728031b948d82045ece3b530b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e332d3737374242343f7374796c653d666c61742d737175617265) [![License](https://camo.githubusercontent.com/942e017bf0672002dd32a857c95d66f28c5900ab541838c6c664442516309c8a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c61742d737175617265)](LICENSE)

---

Table of Contents
-----------------

[](#table-of-contents)

- [Features](#features)
- [Requirements](#requirements)
- [Installation](#installation)
    - [Laravel](#laravel)
    - [Pure PHP](#pure-php)
- [Configuration](#configuration)
- [Authentication](#authentication)
- [Quick Start](#quick-start)
- [Documentation](#documentation)
- [Usage](#usage)
    - [Transactional Emails](#transactional-emails)
    - [Domains](#domains)
    - [Templates](#templates)
    - [Campaigns](#campaigns)
    - [Contacts, Lists, Segments &amp; Tags](#contacts-lists-segments--tags)
    - [Analytics](#analytics)
    - [Message Events &amp; Delivery Logs](#message-events--delivery-logs)
    - [Webhooks](#webhooks)
    - [Suppressions](#suppressions)
- [Working with Responses](#working-with-responses)
- [Collections &amp; Pagination](#collections--pagination)
- [Error Handling](#error-handling)
- [Testing](#testing)
- [Available Resources](#available-resources)
- [Contributing](#contributing)
- [Security](#security)
- [Support](#support)
- [License](#license)

Features
--------

[](#features)

- **Transactional email** with attachments, CC/BCC, templates, tags, and metadata.
- **Campaigns** — create, schedule, send, pause/resume, and read analytics &amp; events.
- **Audience management** — contacts, lists, audiences, segments, tags, imports, and exports.
- **Deliverability** — domains, DNS records, suppressions, message events, and delivery logs.
- **Webhooks** — full CRUD, secret rotation, delivery inspection, event replay, and local HMAC signature verification.
- **First-class Laravel integration** — auto-discovered service provider, `MailerMine` facade, and publishable config.
- **Framework-agnostic** — works in any PHP 8.3+ project, with or without Laravel.
- **Typed &amp; discoverable** — full IDE autocomplete, typed exceptions, and clean `Response`/`Collection` value objects.
- **Battle-tested** — PHPStan level 8, Laravel Pint, and a comprehensive test suite in CI.

Requirements
------------

[](#requirements)

RequirementVersionPHP8.3 or 8.4Laravel12.x or 13.x (optional)Extensions`curl`, `json`, `mbstring`Installation
------------

[](#installation)

Install the package via Composer:

```
composer require mailermine/mailermine
```

### Laravel

[](#laravel)

The service provider and `MailerMine` facade are registered automatically through Laravel package discovery — no manual setup required.

Publish the configuration file (optional):

```
php artisan vendor:publish --tag=mailermine-config
```

Add your credentials to `.env`:

```
MAILERMINE_API_KEY=your-api-key
MAILERMINE_BASE_URL=https://mailermine.com/api/v1
MAILERMINE_TIMEOUT=30
```

### Pure PHP

[](#pure-php)

No framework required — instantiate the client directly:

```
require __DIR__.'/vendor/autoload.php';

use MailerMine\Client;

$mm = new Client('your-api-key');

// Or with a custom base URL (e.g. self-hosted or staging):
$mm = new Client('your-api-key', 'https://mailermine.com/api/v1');
```

Configuration
-------------

[](#configuration)

When using Laravel, all configuration lives in `config/mailermine.php`:

```
return [
    'api_key'  => env('MAILERMINE_API_KEY'),
    'base_url' => env('MAILERMINE_BASE_URL', 'https://mailermine.com/api/v1'),
    'timeout'  => (float) env('MAILERMINE_TIMEOUT', 30),
];
```

For advanced configuration in any environment, build a `Configuration` object:

```
use MailerMine\Client;
use MailerMine\Config\Configuration;

$config = new Configuration(
    apiKey: 'your-api-key',
    baseUrl: 'https://mailermine.com/api/v1',
    timeout: 30.0,
    userAgent: 'my-app/1.0',
    debug: false,
);

$mm = new Client($config);
```

Authentication
--------------

[](#authentication)

MailerMine authenticates with a Bearer API key. Create one in your [MailerMine dashboard](https://mailermine.com) and store it in an environment variable — **never commit API keys to source control**.

Quick Start
-----------

[](#quick-start)

Send your first email. In Laravel, use whichever access style you prefer — they all resolve the same shared, pre-configured client.

**1. Facade** (recommended for most Laravel apps):

```
use MailerMine\Facades\MailerMine;

$email = MailerMine::emails()->send([
    'from'    => 'MailerMine ',
    'to'      => 'john@example.com',
    'subject' => 'Hello from MailerMine',
    'html'    => 'It works!',
]);

echo $email->data()['uuid'];
```

**2. `mailermine()` helper** (a quick global shortcut):

```
$email = mailermine()->emails()->send([
    'from'    => 'hello@mailermine.com',
    'to'      => 'john@example.com',
    'subject' => 'Hello from MailerMine',
    'html'    => 'It works!',
]);
```

**3. Dependency injection** (best for testable services — type-hint the client or the `ClientContract` interface):

```
use MailerMine\Client;

class WelcomeMailer
{
    public function __construct(private readonly Client $mailermine) {}

    public function send(string $email): void
    {
        $this->mailermine->emails()->send([
            'from'    => 'hello@mailermine.com',
            'to'      => $email,
            'subject' => 'Welcome',
            'html'    => 'Welcome aboard!',
        ]);
    }
}
```

**4. Raw client** (outside Laravel, or when you need full control):

```
$mm = new MailerMine\Client('your-api-key');

$mm->emails()->send([
    'from'    => 'hello@mailermine.com',
    'to'      => 'john@example.com',
    'subject' => 'Hello',
    'html'    => 'Hi there',
]);
```

> The rest of this guide uses a `$mm` client instance. In Laravel you can swap `$mm->` for the `MailerMine::` facade or the `mailermine()` helper anywhere.

Documentation
-------------

[](#documentation)

Step-by-step guides live in the [`docs/`](docs) directory:

GuideDescription[Installation](docs/installation.md)Composer install for Laravel and pure PHP[Quick start](docs/quick-start.md)First email in minutes[Authentication](docs/authentication.md)API keys[Transactional email](docs/transactional.md)Send, attachments, templates[Domains](docs/domains.md)DNS verification[Templates](docs/templates.md)Reusable templates[Contacts](docs/contacts.md)Audience management[Campaigns](docs/campaigns.md)Create, schedule, send[Analytics](docs/analytics.md)Engagement metrics[Webhooks](docs/webhooks.md)Endpoints and signature verification[FAQ](docs/faq.md)Common questions[Troubleshooting](docs/troubleshooting.md)Debugging[Migration](docs/migration.md)Version upgradesUsage
-----

[](#usage)

### Transactional Emails

[](#transactional-emails)

```
// Simple send
$mm->emails()->send([
    'from'     => 'hello@mailermine.com',
    'to'       => 'john@example.com',
    'subject'  => 'Your receipt',
    'html'     => 'Thanks for your purchase.',
    'text'     => 'Thanks for your purchase.',
    'reply_to' => 'support@mailermine.com',
    'tags'     => ['receipt'],
    'metadata' => ['order_id' => 1234],
]);

// Multiple recipients + CC/BCC (string or array accepted)
$mm->emails()->send([
    'from'    => 'sales@mailermine.com',
    'to'      => ['a@example.com', 'b@example.com'],
    'cc'      => 'manager@example.com',
    'bcc'     => ['archive@example.com'],
    'subject' => 'Quote',
    'html'    => 'See attached.',
]);

// Attachments (Base64 encoded content)
$mm->emails()->send([
    'from'        => 'billing@mailermine.com',
    'to'          => 'john@example.com',
    'subject'     => 'Invoice',
    'html'        => 'Invoice attached.',
    'attachments' => [[
        'filename'     => 'invoice.pdf',
        'content'      => base64_encode(file_get_contents('invoice.pdf')),
        'content_type' => 'application/pdf',
    ]],
]);

// Send with a template
$mm->emails()->send([
    'from'        => 'hello@mailermine.com',
    'to'          => 'john@example.com',
    'template_id' => $templateId,
    'variables'   => ['first_name' => 'John'],
]);

// Inspect sent messages
$email  = $mm->emails()->get($messageId);
$events = $mm->emails()->events($messageId);
$recent = $mm->emails()->list(['status' => 'sent', 'page' => 1]);
```

### Domains

[](#domains)

```
$domain = $mm->domains()->create(['domain' => 'mail.example.com']);
$id     = $domain->data()['id'];

// DNS records you need to add
foreach ($mm->domains()->dnsRecords($id) as $record) {
    echo "{$record['type']} {$record['name']} {$record['value']}\n";
}

$mm->domains()->verify($id);
$mm->domains()->status($id);
$mm->domains()->list(['status' => 'verified']);
$mm->domains()->delete($id);
```

### Templates

[](#templates)

```
$template = $mm->templates()->create([
    'name'    => 'Welcome Email',
    'subject' => 'Welcome {{first_name}}',
    'html'    => 'Welcome {{first_name}}!',
    'text'    => 'Welcome {{first_name}}!',
]);

$id = $template->data()['id'];

$mm->templates()->preview($id, ['first_name' => 'John']);
$mm->templates()->update($id, ['subject' => 'Hey {{first_name}}']);
$mm->templates()->duplicate($id, ['name' => 'Welcome (copy)']);
$mm->templates()->list(['search' => 'welcome']);
$mm->templates()->delete($id);
```

### Campaigns

[](#campaigns)

```
// Create a fully configured draft in one call
$campaign = $mm->campaigns()->create([
    'name'        => 'March Newsletter',
    'subject'     => "What's new this month",
    'from_name'   => 'MailerMine',
    'from_email'  => 'news@mailermine.com',
    'template_id' => $templateId,
]);

$id = $campaign->data()['uuid'];

// Recipients
$mm->campaigns()->addAudience($id, $audienceId);
$mm->campaigns()->addSegment($id, $segmentId);
$count = $mm->campaigns()->recipientCount($id);

// Content helpers
$mm->campaigns()->setTemplate($id, $templateId);
$mm->campaigns()->setSubject($id, 'A better subject');
$mm->campaigns()->setSender($id, 'news@mailermine.com', 'MailerMine');

// Schedule for later…
$mm->campaigns()->schedule($id, [
    'scheduled_at' => '2026-08-01T09:00:00+00:00',
    'timezone'     => 'UTC',
]);

// …or send right now
$mm->campaigns()->sendNow($id);

// Lifecycle
$mm->campaigns()->pause($id);
$mm->campaigns()->resume($id);
$mm->campaigns()->cancel($id);
$mm->campaigns()->archive($id);

// Analytics & events
$analytics = $mm->campaigns()->analytics($id);
$opens     = $mm->campaigns()->opens($id);
$clicks    = $mm->campaigns()->clicks($id);
$events    = $mm->campaigns()->events($id);
```

### Contacts, Lists, Segments &amp; Tags

[](#contacts-lists-segments--tags)

```
// Contacts
$contact = $mm->contacts()->upsert([
    'email'      => 'john@example.com',
    'first_name' => 'John',
    'subscribed' => true,
]);

$id = $contact->data()['id'];

$mm->contacts()->update($id, ['last_name' => 'Doe']);
$mm->contacts()->subscribe($id);
$mm->contacts()->unsubscribe($id);
$mm->contacts()->list(['subscribed' => true, 'page' => 1]);
$mm->contacts()->search('john');

// Lists
$list = $mm->lists()->create(['name' => 'Newsletter']);
$mm->lists()->addContact($list->data()['id'], $id);

// Segments (dynamic)
$segment = $mm->segments()->create([
    'name'  => 'Active subscribers',
    'rules' => [
        'logic' => 'and',
        'rules' => [
            ['field' => 'subscribed', 'operator' => 'equals', 'value' => true],
        ],
    ],
]);
$mm->segments()->preview($segment->data()['id']);

// Tags
$tag = $mm->tags()->create(['name' => 'vip']);
$mm->tags()->assign([
    'contact_ids' => [$id],
    'tag_ids'     => [$tag->data()['id']],
]);

// Imports & exports
$import = $mm->imports()->create(['file' => '/path/to/contacts.csv']);
$mm->imports()->status($import->data()['id']);

$export = $mm->exports()->create(['status' => 'active', 'subscribed' => true]);
$csv    = $mm->exports()->download($export->data()['id']);
```

### Analytics

[](#analytics)

```
$range = ['from' => '2026-01-01', 'to' => '2026-01-31'];

$overview = $mm->analytics()->overview($range);

$mm->analytics()->deliveries($range);
$mm->analytics()->opens($range);
$mm->analytics()->clicks($range);
$mm->analytics()->bounces($range);
$mm->analytics()->complaints($range);
$mm->analytics()->unsubscribes($range);
$mm->analytics()->usage($range);
$mm->analytics()->activity($range);

// Filter by project, domain, or campaign
$mm->analytics()->opens(['from' => '2026-01-01', 'campaign_id' => $campaignId]);
```

Dates accept ISO-8601 strings or `DateTimeInterface` instances.

### Message Events &amp; Delivery Logs

[](#message-events--delivery-logs)

```
// Platform-wide event stream
$mm->events()->list(['type' => 'email.opened', 'from' => '2026-01-01']);
$mm->events()->get($eventId);

// A single message's timeline
$mm->events()->timeline($messageId);
$mm->events()->history($messageId);

// Delivery logs
$mm->messages()->list(['status' => 'delivered']);
$mm->messages()->search('john@example.com');
$mm->messages()->filter(['status' => 'bounced', 'from' => '2026-01-01']);
```

### Webhooks

[](#webhooks)

```
$webhook = $mm->webhooks()->create([
    'name'              => 'Production events',
    'url'               => 'https://example.com/webhooks/mailermine',
    'subscribed_events' => ['email.delivered', 'email.opened', 'email.bounced'],
]);

// The signing secret is only returned on create/rotate — store it now.
$secret = $webhook->data()['secret'];

$mm->webhooks()->list();
$mm->webhooks()->update($id, ['is_active' => false]);
$mm->webhooks()->rotateSecret($id);
$mm->webhooks()->test($id);

// Inspect deliveries and replay failures
$mm->webhooks()->deliveries($id);
$mm->webhooks()->failures($id);
$mm->webhooks()->replay($id);
$mm->webhooks()->retry($deliveryId);
```

**Verifying incoming webhooks** — MailerMine signs each payload with HMAC-SHA256. Always verify before trusting a request:

```
use MailerMine\Resources\Webhooks;

$payload   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_MAILERMINE_SIGNATURE'] ?? '';

if (! Webhooks::verify($payload, $signature, $secret)) {
    http_response_code(401);
    exit;
}

$event = json_decode($payload, true);
```

In Laravel:

```
use Illuminate\Http\Request;
use MailerMine\Resources\Webhooks;

public function handle(Request $request)
{
    $valid = Webhooks::verify(
        $request->getContent(),
        $request->header('X-MailerMine-Signature', ''),
        config('services.mailermine.webhook_secret'),
    );

    abort_unless($valid, 401);

    // Handle $request->json()->all()
}
```

### Suppressions

[](#suppressions)

```
$check = $mm->suppressions()->check('john@example.com');

if (! ($check->data()['suppressed'] ?? false)) {
    $mm->suppressions()->add([
        'email'  => 'john@example.com',
        'reason' => 'manual',
    ]);
}

$mm->suppressions()->list(['reason' => 'bounce']);
$mm->suppressions()->remove($suppressionId);
```

Working with Responses
----------------------

[](#working-with-responses)

Every single-resource call returns an immutable `Response` object. It hides the generated model details while giving you convenient access to the payload:

```
$response = $mm->emails()->send([...]);

$response->data();      // The primary payload (the `data` key when present)
$response->message();   // API message string, or null
$response->success();   // bool|null
$response->toArray();   // Full payload as an array
$response['uuid'];      // ArrayAccess to the payload
json_encode($response); // JsonSerializable
```

Collections &amp; Pagination
----------------------------

[](#collections--pagination)

List calls return an immutable, iterable `Collection`:

```
$contacts = $mm->contacts()->list(['page' => 1, 'per_page' => 25]);

count($contacts);          // number of items on the page
$contacts->isEmpty();
$contacts->first();
$contacts->all();          // list

foreach ($contacts as $contact) {
    echo $contact['email'];
}

if ($page = $contacts->pagination()) {
    $page->currentPage;    // int
    $page->perPage;        // int
    $page->total;          // int
    $page->lastPage;       // int
    $page->hasMorePages(); // bool
}
```

Paginate through every page:

```
$page = 1;

do {
    $contacts = $mm->contacts()->list(['page' => $page, 'per_page' => 100]);

    foreach ($contacts as $contact) {
        // process $contact
    }

    $meta = $contacts->pagination();
    $page++;
} while ($meta && $meta->hasMorePages());
```

Error Handling
--------------

[](#error-handling)

The SDK maps API failures to typed exceptions, all extending `ApiException`:

ExceptionHTTP statusWhen`AuthenticationException`401Missing or invalid API key`PlanException`403Feature not on your plan, or account restricted`NotFoundException`404Resource does not exist`ValidationException`422Invalid request data (server- or client-side)`RateLimitException`429Rate limit exceeded`ApiException`otherAny other API/transport errorEvery exception extends `ApiException`, so a single `catch (ApiException $e)`handles them all, and `$e->getRequestId()` returns the MailerMine request ID (when present) to include when contacting support.

```
use MailerMine\Exceptions\ApiException;
use MailerMine\Exceptions\AuthenticationException;
use MailerMine\Exceptions\PlanException;
use MailerMine\Exceptions\RateLimitException;
use MailerMine\Exceptions\ValidationException;

try {
    $mm->emails()->send([...]);
} catch (ValidationException $e) {
    // Field-level validation errors (from the API or client-side checks).
    foreach ($e->getErrors() as $field => $messages) {
        // ...
    }
} catch (PlanException $e) {
    // The action isn't available on the current plan.
    // $e->getMessage() already includes actionable upgrade guidance.
    return redirect()->away($e->getUpgradeUrl());
} catch (RateLimitException $e) {
    $retryAfter = $e->getRetryAfter(); // seconds, or null
} catch (AuthenticationException $e) {
    // The API key is missing or incorrect.
} catch (ApiException $e) {
    $e->getStatusCode();   // int
    $e->getMessage();      // clean, developer-friendly message
    $e->getRequestId();    // MailerMine request ID, or null
    $e->getResponseBody(); // raw response body
    $e->getHeaders();      // response headers
}
```

> **Client-side validation:** invalid payloads (for example a missing `from` or `to`) raise a `ValidationException` *before* the request is sent, so you get fast, friendly feedback without a round-trip. Generated OpenAPI exceptions are never exposed — they are always converted into these SDK exceptions.

Testing
-------

[](#testing)

The SDK accepts an injectable Guzzle client, making it trivial to mock API responses in your tests without hitting the network:

```
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response as GuzzleResponse;
use MailerMine\Client;

$mock = new MockHandler([
    new GuzzleResponse(200, [], json_encode([
        'success' => true,
        'data'    => ['uuid' => 'msg_123'],
    ])),
]);

$http = new GuzzleClient(['handler' => HandlerStack::create($mock)]);
$mm   = new Client('test-key', 'https://mailermine.com/api/v1', $http);

$response = $mm->emails()->send([
    'from'    => 'hello@mailermine.com',
    'to'      => 'john@example.com',
    'subject' => 'Test',
    'html'    => 'Test',
]);

// $response->data()['uuid'] === 'msg_123'
```

To run the package's own test suite:

```
composer test        # PHPUnit
composer test:lint   # Laravel Pint (code style)
composer analyse     # PHPStan (level 8)
composer check       # all of the above
```

Available Resources
-------------------

[](#available-resources)

AccessorDescription`emails()`Transactional email + message lookups`domains()`Sending domains, DNS records, verification`templates()`Reusable email templates`campaigns()`Campaigns, scheduling, lifecycle, analytics, events`contacts()`Contacts and subscription state`lists()`Static contact lists`audiences()`Lists and segments as unified audiences`segments()`Dynamic, rule-based segments`tags()`Contact tags`imports()`CSV / bulk contact imports`exports()`Contact / data exports`analytics()`Account-wide analytics`events()`Message event stream and timelines`messages()`Delivery logs`webhooks()`Webhooks, deliveries, and event replay`suppressions()`Suppression list management`projects()`Projects`apiKeys()`API key managementRunnable examples for the most common workflows live in the [`examples/`](examples) directory.

Contributing
------------

[](#contributing)

Contributions are welcome! Please read the [Contributing guide](CONTRIBUTING.md)before opening a pull request. Note that the `generated/` directory is produced from the OpenAPI specification and must not be edited by hand.

Security
--------

[](#security)

If you discover a security vulnerability, please review our [Security Policy](SECURITY.md) and report it privately. Do **not** open a public issue.

Support
-------

[](#support)

- 📖 Documentation: [`docs/`](docs) ·
- 💬 Discussions:
- 🐛 Issues:
- 📦 Packagist:
- ✉️ Email:

License
-------

[](#license)

The MIT License (MIT). Please see the [License File](LICENSE) for more information.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance90

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

46d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/140411578?v=4)[rahulyadav5192](/maintainers/rahulyadav5192)[@rahulyadav5192](https://github.com/rahulyadav5192)

---

Top Contributors

[![rahulyadav5192](https://avatars.githubusercontent.com/u/140411578?v=4)](https://github.com/rahulyadav5192 "rahulyadav5192 (7 commits)")

---

Tags

apilaravelsdkemailwebhooksmarketinganalyticstransactional emailcampaignsmailermine

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/mailermine-mailermine/health.svg)

```
[![Health](https://phpackages.com/badges/mailermine-mailermine/health.svg)](https://phpackages.com/packages/mailermine-mailermine)
```

###  Alternatives

[aws/aws-sdk-php

AWS SDK for PHP - Use Amazon Web Services in your PHP project

6.4k567.5M2.9k](/packages/aws-aws-sdk-php)[eslazarev/wildberries-sdk

Wildberries OpenAPI clients (generated).

353.6k](/packages/eslazarev-wildberries-sdk)[neuron-core/neuron-ai

The PHP Agentic Framework.

2.1k1.0M59](/packages/neuron-core-neuron-ai)[oat-sa/tao-core

TAO core extension

64152.2k178](/packages/oat-sa-tao-core)[google/cloud

Google Cloud Client Library

1.2k17.1M58](/packages/google-cloud)[google/cloud-core

Google Cloud PHP shared dependency, providing functionality useful to all components.

350141.3M158](/packages/google-cloud-core)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
