Symfony Mailer 1,596 (github.com/symfony/mailer (https://github.com/symfony/mailer 1,596 ), MIT; 8.1.7 of 15 September 2026, PHP 8.4.1 or later) is the mail layer under Laravel 2,157 and works alone. The transport is one DSN string, so switching from Mailpit to a provider is configuration.
<?php
declare(strict_types=1);
require 'vendor/autoload.php';
use Symfony\Component\Mailer\{Mailer, Transport};
use Symfony\Component\Mime\{Address, Email};
$mailer = new Mailer(Transport::fromDsn(getenv('MAILER_DSN') ?: 'smtp://127.0.0.1:1019'));
$mailer->send((new Email())
->from(new Address('orders@example.com', 'Bookshop'))
->to(new Address('reader@example.com', 'Zoë Reader'))
->subject('Your receipt for order #1001')
->text('Thanks for your order.')->html('<p>Thanks for your <b>order</b>.</p>')
->attach("sku,qty\r\nBK-101,1\r\n", 'order-1001.csv', 'text/csv'));$ php symfony-mail.php && curl -s localhost:8019/api/v1/message/latest/raw |
grep -E '^Content-Type'
Content-Type: multipart/mixed; boundary=TNMOkDo0
Content-Type: multipart/alternative; boundary=8KZns0yl
Content-Type: text/plain; charset=utf-8
Content-Type: text/html; charset=utf-8
Content-Type: text/csv; name=order-1001.csvThat is the tree drawn in 4.19.3. A provider's bridge package adds an HTTP API transport, such as symfony/amazon-mailer with ses+api://KEY:SECRET@default (Postmark 23,738 , Mailgun 23,097 and Resend 17,150 have theirs). Receivers trust your mail once your domain publishes SPF (servers allowed to send for it), DKIM (the key that verifies the signature) and DMARC (what to do when neither passes for the From domain). Gmail 1 has required SPF or DKIM from every sender since February 2024, and all three above 5,000 messages a day.