Skip to content
Writing
NewLaravelPHPEmail APIDevOpsArchitecture

Laravel Transactional Email: Native Transport Guide

Tired of Mailgun pricing hikes and complex PHP packages? Here is how to configure native transactional email delivery in Laravel 10, 11, and 12 using SadaSend.

Tayyab MughalFounder & Chief Architect3 min read

Why Laravel developers are moving away from legacy Mailgun

For years, the default choice for Laravel applications was the built-in Mailgun driver or generic SMTP. However, recent changes to Mailgun pricing tiers, mandatory paid add-ons for log retention, and strict rate limits on entry accounts have driven Laravel engineers to seek leaner alternatives.

Laravel 10, 11, and 12 provide a modern, modular Mail facade built on Symfony Mailer. You do not need bloated third-party vendor packages or complex multipart form SDKs to send high-deliverability transactional emails.

With SadaSend, you can either drop in zero-config SMTP credentials or register a lightweight custom HTTP transport that leverages PHP 8.2+ native cURL / Symfony HttpClient for fast dispatch.

Step 1: Configuring config/mail.php and environment variables

The fastest path to integration is configuring SadaSend as your primary SMTP mailer in your Laravel application.

PHP
// .env
MAIL_MAILER=smtp
MAIL_SCHEME=smtp
MAIL_HOST=smtp.sadasend.com
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=sada_live_your_api_key_here
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="notifications@mail.yourdomain.com"
MAIL_FROM_NAME="${APP_NAME}"

// config/mail.php
'mailers' => [
    'smtp' => [
        'transport' => 'smtp',
        'url' => env('MAIL_URL'),
        'host' => env('MAIL_HOST', 'smtp.sadasend.com'),
        'port' => env('MAIL_PORT', 587),
        'encryption' => env('MAIL_ENCRYPTION', 'tls'),
        'username' => env('MAIL_USERNAME'),
        'password' => env('MAIL_PASSWORD'),
        'timeout' => 10,
        'local_domain' => env('MAIL_EHLO_DOMAIN'),
    ],
],

Step 2: Building a Queued Mailable with Laravel Horizon

Always implement ShouldQueue on transactional Mailables to prevent slow SMTP handshakes from blocking user HTTP requests.

PHP
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class OrderConfirmationMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public function __construct(public array $order) {}

    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'Your Order #' . $this->order['id'] . ' has been confirmed',
        );
    }

    public function content(): Content
    {
        return new Content(
            view: 'emails.orders.confirmed',
            with: ['order' => $this->order],
        );
    }
}

Feature Comparison: Legacy Mailgun vs Modern SadaSend in Laravel

FeatureMailgun (mailgun/mailgun-php)SadaSend (Native SMTP / REST)
Package DependenciesRequires guzzlehttp + mailgun-php0 third-party packages required
Base Cost Floor$35.00 / month Foundation minimum$12.00 / month Starter (3k free/month, 100/day)
Staging Safe ModeManual sandbox authorizationHardware per-key recipient allowlists
AI Agent MCP ServerNot availableNative Claude Desktop & Cursor tool calling
Dead-Letter Queue (DLQ)Paid add-on with short retentionIncluded with 1-click message replay

Local Development & CI/CD Testing Best Practices

In local development, set MAIL_MAILER=log or configure a scoped SadaSend Staging API key. By setting a recipient allowlist on your staging key, your local php artisan test and staging seeders will never risk emailing real customers if a live database dump is imported.

Free plan

Building AI agents that send email?

Scoped API keys, per-key recipient allowlists, approval mode and a hosted MCP server with ten tools — on the free plan, without a card.