PHPackages                             ashraful19/laravel-mailbridge - 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. ashraful19/laravel-mailbridge

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

ashraful19/laravel-mailbridge
=============================

Provider-neutral transactional and marketing email bridge for Laravel.

v1.5.0(3w ago)633MITPHPPHP ^8.2CI passing

Since May 4Pushed 3w agoCompare

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

READMEChangelog (10)Dependencies (21)Versions (16)Used By (0)

Laravel MailBridge
==================

[](#laravel-mailbridge)

[![Tests](https://github.com/ashraful19/laravel-mailbridge/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/ashraful19/laravel-mailbridge/actions/workflows/tests.yml)[![Docs](https://github.com/ashraful19/laravel-mailbridge/actions/workflows/docs.yml/badge.svg?branch=main)](https://github.com/ashraful19/laravel-mailbridge/actions/workflows/docs.yml)[![Latest Version](https://camo.githubusercontent.com/2263b9a76ad327c6a9544a75c32b721b15ad68b9bf87002a85ae8b22b1ab3cef/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f617368726166756c31392f6c61726176656c2d6d61696c6272696467652e737667)](https://packagist.org/packages/ashraful19/laravel-mailbridge)[![PHP Version](https://camo.githubusercontent.com/d91d3d1139cf0d8faaa80eeeeac7d3c59c9319e56960ef81c948e4160be4c4c1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e322d3737376262342e737667)](composer.json)[![Laravel Version](https://camo.githubusercontent.com/8829a3ea8dbe923c9811de75042d2c9fce97daa8285fd4bb7b650952814e1d1d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d253545313225374325354531332d6666326432302e737667)](composer.json)[![License: MIT](https://camo.githubusercontent.com/074b89bca64d3edc93a1db6c7e3b1636b874540ba91d66367c0e5e354c56d0ea/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e737667)](LICENSE.md)

Provider-neutral transactional and marketing email for Laravel 12+.

MailBridge keeps your application code stable while providers, SDKs, template ids, and marketing APIs vary behind adapters. Your app uses the same MailBridge methods while SendGrid, Amazon SES, Brevo, MailerSend, Resend, Postmark, Mailchimp, Kit, MailerLite, Mailgun, Mailjet, and AutoSend each run through their official SDKs internally.

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

[](#documentation)

Full docs:

Source docs:

- [Installation](docs/guide/installation.md)
- [Provider install](docs/guide/provider-install.md)
- [Laravel mail compatibility](docs/guide/laravel-mail.md)
- [Transactional email](docs/guide/transactional.md)
- [Hosted templates and provider-specific data](docs/guide/templates.md)
- [Marketing email](docs/guide/marketing.md)
- [Response shapes](docs/guide/responses.md)
- [Exception handling](docs/guide/exceptions.md)
- [Fallback](docs/guide/fallback.md)
- [Testing](docs/guide/testing.md)
- [Security](docs/guide/security.md)
- [Capabilities](docs/guide/capabilities.md)
- [Troubleshooting](docs/guide/troubleshooting.md)

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

[](#quick-start)

```
composer require ashraful19/laravel-mailbridge
php artisan vendor:publish --tag=mailbridge-config
php artisan mailbridge:install
```

`mailbridge:install` opens a terminal checklist so you can install one or more provider SDKs. The base package does not install every SDK.

Set runtime provider settings in `.env`:

```
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME="Example App"
MAILBRIDGE_TRANSACTIONAL=brevo
MAILBRIDGE_MARKETING=mailerlite
BREVO_API_KEY=
SENDGRID_API_KEY=
SENDGRID_MARKETING_SENDER_ID=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
MAILERLITE_API_KEY=
MAILCHIMP_API_KEY=
MAILCHIMP_SERVER_PREFIX=us1
MAILCHIMP_AUDIENCE_ID=
MAILCHIMP_TRANSACTIONAL_API_KEY=
KIT_API_KEY=
MAILJET_API_KEY=
MAILJET_SECRET_KEY=
AUTOSEND_API_KEY=
```

Optional: set provider-level sender defaults in `config/mailbridge.php` (for providers that should use a different sender than global `MAIL_FROM_*`):

```
'providers' => [
    'postmark' => [
        'server_token' => env('POSTMARK_SERVER_TOKEN'),
        'from' => [
            'address' => env('POSTMARK_FROM_ADDRESS'),
            'name' => env('POSTMARK_FROM_NAME'),
        ],
    ],
],
```

Sender precedence is: `->from(...)` at runtime -&gt; `mailbridge.providers..from` -&gt; `mailbridge.from` (`MAIL_FROM_*`).

Configure template and list mappings in `config/mailbridge.php` (`templates`, `lists`).

Basic Usage
-----------

[](#basic-usage)

Existing Laravel mail stays compatible:

```
Mail::to($user)->send(new WelcomeMail($user));
```

Send a Laravel `Mailable` through MailBridge:

```
MailBridge::transactional()
    ->to($user->email, $user->name)
    ->send(new WelcomeMail($user));
```

Send a provider-hosted template:

```
MailBridge::transactional()
    ->template('welcome')
    ->to($user->email)
    ->data(['name' => $user->name])
    ->send();
```

Use provider-specific template data when providers expect different variable names:

```
MailBridge::transactional()
    ->template('welcome')
    ->to($user->email)
    ->data(['name' => $user->name])
    ->dataFor('brevo', ['FIRSTNAME' => $user->name])
    ->dataFor('postmark', ['name' => $user->name])
    ->send();
```

Send through one provider for this request:

```
MailBridge::transactional('postmark')
    ->withFallback(false)
    ->to($user->email)
    ->subject('Welcome')
    ->text('Hello')
    ->send();
```

Subscribe a marketing contact:

```
use Ashraful19\LaravelMailbridge\Data\Subscriber;

MailBridge::marketing()
    ->list('signup')
    ->subscribe(Subscriber::make($user->email)->name($user->name));
```

Work with subscribers and campaigns using the same API across marketing providers:

```
use Ashraful19\LaravelMailbridge\Data\Campaign;

MailBridge::marketing()
    ->list('signup')
    ->unsubscribe($user->email);

$subscriber = MailBridge::marketing()->getSubscriber($user->email);

$campaign = MailBridge::marketing()
    ->createCampaign(
        Campaign::make('Product Launch')
            ->subject('New release is live')
            ->html('Launch')
            ->list('signup')
    );
```

Return Objects
--------------

[](#return-objects)

Transactional send returns `SendResult`:

```
$result = MailBridge::transactional()
    ->to($user->email)
    ->subject('Welcome')
    ->text('Hello')
    ->send();

$result->provider;  // string, selected provider name
$result->messageId; // ?string, provider message id when available
$result->metadata;  // array, provider-specific extra data
```

Marketing actions return `MarketingResult`:

```
$result = MailBridge::marketing()
    ->list('signup')
    ->subscribe(Subscriber::make($user->email));

$result->provider;  // string
$result->operation; // string, e.g. subscribe, campaign_create
$result->metadata;  // array, provider-specific fields
```

Subscriber lookup returns `SubscriberRecord|null`:

```
$record = MailBridge::marketing()->getSubscriber($user->email);

// null when subscriber not found
$record?->provider; // string
$record?->email;    // string
$record?->data;     // array, provider-native payload
```

Providers
---------

[](#providers)

Provider SDKs are installed only when selected, and each install command uses the exact SDK version tested by MailBridge.

ProviderLaneCurrent adapter supportInstallSendGridTransactional + marketingraw send, hosted templates, categories, custom args, contacts, lists, campaigns`php artisan mailbridge:install sendgrid`Amazon SESTransactionalraw send, hosted templates, SES tags, raw MIME attachments`php artisan mailbridge:install ses`BrevoTransactional + marketingraw send, hosted templates, tags, subscribers, campaigns`php artisan mailbridge:install brevo`MailerSendTransactionalraw send, hosted templates, personalization, tags`php artisan mailbridge:install mailersend`ResendTransactionalraw send, template payload, tags/headers`php artisan mailbridge:install resend`PostmarkTransactionalraw send, hosted templates, tags, metadata, message streams`php artisan mailbridge:install postmark`MailchimpTransactional + marketingMailchimp Transactional sends, audiences, subscribers, tags, campaigns`php artisan mailbridge:install mailchimp`KitMarketingsubscribers, tags/forms/sequences, broadcasts`php artisan mailbridge:install kit`MailerLiteMarketingsubscribers, groups, fields, campaigns`php artisan mailbridge:install mailerlite`MailgunTransactionalraw send, hosted templates, tags, variables, metadata`php artisan mailbridge:install mailgun`MailjetTransactional + marketingraw send, hosted templates, subscribers, lists, campaigns`php artisan mailbridge:install mailjet`AutoSendTransactional + marketingraw send, hosted templates, tags, metadata, contacts, lists, campaignsNo SDK required — uses REST API directlyRun health checks anytime:

```
php artisan mailbridge:doctor
```

Smoke-test real provider APIs before releasing:

```
php artisan mailbridge:verify --provider=brevo --email=test@example.com --cleanup
```

Features
--------

[](#features)

Transactional email:

FeaturePurposeRaw HTML/text sendSend simple app-rendered messages without a Laravel `Mailable`.Laravel `Mailable` sendKeep existing Laravel mail classes and route them through MailBridge.Provider-hosted templatesSend by config alias with `template('welcome')` or direct id with `templateId(...)`.Provider-specific template dataUse `data()` for common variables and `dataFor()` for provider overrides.RecipientsNormalize `to`, `cc`, `bcc`, `from`, and `replyTo` across providers.AttachmentsAdd files or raw data with `attach()` and `attachData()`.Tags/categoriesAttach provider analytics tags where supported.Metadata/custom argsAttach safe message metadata for provider analytics and webhook correlation.Provider overrideSend one message through a specific provider without changing config.Fallback controlUse `withFallback()` or `withFallback(false)` per send.Testing fakeAssert transactional sends without touching provider APIs.Provider note: SendGrid, Brevo, and Mailjet marketing list IDs must be numeric. MailBridge validates these IDs before building provider payloads.

Marketing email currently implemented in the common API:

FeaturePurposeSubscriber subscribeCreate or update contacts where the provider endpoint supports it.Subscriber unsubscribeRemove a contact from a list or group.Subscriber lookup/deleteRead or delete a marketing contact.List/group subscribeSubscribe contacts to configured list aliases.Fields/attributesSync custom subscriber profile data.CampaignsCreate, send, schedule, get, and delete campaign records where supported.Provider overrideRun one marketing operation through a specific provider.Fallback controlRetry transient provider/network failures through configured fallbacks.Testing fakeAssert marketing subscriptions without provider calls.Why MailBridge
--------------

[](#why-mailbridge)

NeedMailBridge behaviorKeep Laravel `Mailable` classes`Mail::send()` still works; MailBridge can also send `Mailable` objects.Avoid installing every SDKProvider SDKs are optional and installed per provider.Prevent surprise SDK breaksInstall commands use tested exact versions.Use hosted templatesSend by `template('welcome')` alias or direct `templateId('...')`.Switch provider per sendPass provider name: `MailBridge::transactional('postmark')`.Control fallbackUse `withFallback()` or `withFallback(false)` per send.Test safelyUse `MailBridge::fake()` and assertions.Exception Handling
------------------

[](#exception-handling)

MailBridge throws typed exceptions for common validation and configuration errors. All validation-focused exceptions extend `MailbridgeValidationException`, so existing broad catches still work.

ExceptionTrigger`MissingTransactionalRecipientException`Transactional send has no `to()` recipient.`TemplatePayloadConflictException``template()` + `templateId()` are both set, or template send is combined with a Laravel `Mailable`.`MissingTransactionalContentException`Non-template send has no `html()`, no `text()`, and no mailable content.`MissingFromAddressException`No sender address is available from `from()`, `mailbridge.providers..from.address`, or `mailbridge.from.address`.`MissingTemplateMappingException``template('alias')` has no usable provider mapping in `mailbridge.templates..`. Empty values are treated as missing.`UnknownProviderException`Selected provider key does not exist in `mailbridge.providers`.`UnknownDriverException`Provider config uses an unsupported driver value.For full guidance and catch examples, see [Exception handling](docs/guide/exceptions.md).

License
-------

[](#license)

Laravel MailBridge is open-sourced software licensed under the [MIT license](LICENSE.md).

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance94

Actively maintained with recent releases

Popularity16

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity54

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 ~1 days

Total

14

Last Release

26d ago

Major Versions

v0.1.0 → v1.0.02026-05-04

### Community

Maintainers

![](https://www.gravatar.com/avatar/ab06572ecc2701fb9172f587144a4eb20b8e027f75bcc27030e212164c53103c?d=identicon)[ashraful19](/maintainers/ashraful19)

---

Top Contributors

[![ashraful19](https://avatars.githubusercontent.com/u/25670420?v=4)](https://github.com/ashraful19 "ashraful19 (16 commits)")

---

Tags

amazon-sesbrevoemailkitlaravellaravel-packagemailmailchimpmailerlitemailersendmailgunmailjetmarketing-emailpostmarkresendsendgridtransactional-emaillaravelawsmailemailsendgridresendmailgunmailchimpmarketingmandrilltransactionalMailjetseskitpostmarkbrevomailersendmailerliteAmazon SESConvertKitaws-sesautosend

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ashraful19-laravel-mailbridge/health.svg)

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

###  Alternatives

[propaganistas/laravel-disposable-email

Disposable email validator

6012.9M7](/packages/propaganistas-laravel-disposable-email)[laravel/ai

The official AI SDK for Laravel.

9782.1M153](/packages/laravel-ai)[omnimail/omnimail

PHP Library to send email across all platforms using one interface.

33034.8k](/packages/omnimail-omnimail)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

76318.2M110](/packages/laravel-mcp)[spatie/laravel-health

Monitor the health of a Laravel application

88011.3M149](/packages/spatie-laravel-health)[tallstackui/tallstackui

TallStackUI is a powerful suite of Blade components that elevate your workflow of Livewire applications.

719160.4k12](/packages/tallstackui-tallstackui)

PHPackages © 2026

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