Symfony Mailer Bridge

Installation

composer require larafony/mail-symfony

# Optional transports
composer require symfony/amazon-mailer # Amazon SES
composer require symfony/mailgun-mailer # Mailgun
composer require symfony/sendgrid-mailer # SendGrid
composer require symfony/postmark-mailer # Postmark

Configuration

Register the service provider in your bootstrap.php:

use Larafony\Mail\Symfony\ServiceProviders\SymfonyMailerServiceProvider;

$app->withServiceProviders([
SymfonyMailerServiceProvider::class
]);

Create config/mail.php:

use Larafony\Framework\Config\Environment\EnvReader;

return [
'default' => EnvReader::read('MAIL_MAILER', 'smtp'),

'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => EnvReader::read('MAIL_HOST', 'localhost'),
'port' => EnvReader::read('MAIL_PORT', 587),
'encryption' => EnvReader::read('MAIL_ENCRYPTION', 'tls'),
'username' => EnvReader::read('MAIL_USERNAME'),
'password' => EnvReader::read('MAIL_PASSWORD'),
],

'ses' => [
'transport' => 'ses',
'region' => EnvReader::read('AWS_DEFAULT_REGION'),
],

'mailgun' => [
'transport' => 'mailgun',
'domain' => EnvReader::read('MAILGUN_DOMAIN'),
'secret' => EnvReader::read('MAILGUN_SECRET'),
],
],

'from' => [
'address' => EnvReader::read('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => EnvReader::read('MAIL_FROM_NAME', 'Larafony'),
],
];

Using Mailable Classes

use Larafony\Framework\Mail\Mailable;
use Larafony\Framework\Mail\Envelope;
use Larafony\Framework\Mail\Content;
use Larafony\Framework\Mail\Address;

final class WelcomeMail extends Mailable
{
public function __construct(
private readonly User $user,
private readonly string $activationUrl,
) {}

public function envelope(): Envelope
{
return new Envelope(
from: new Address('noreply@example.com', 'Larafony App'),
subject: 'Welcome to Larafony!',
)->addTo(new Address($this->user->email, $this->user->name));
}

public function content(): Content
{
return new Content(
view: 'emails.welcome',
data: [
'user' => $this->user,
'activationUrl' => $this->activationUrl,
],
);
}
}

Sending Emails

use Larafony\Framework\Mail\Contracts\MailerContract;

final class AuthController extends Controller
{
#[Route('/register', methods: ['POST'])]
public function register(MailerContract $mailer, UserDto $dto): ResponseInterface
{
$user = User::create($dto->toArray());

$mailer->send(new WelcomeMail($user, $activationUrl));

return new ResponseFactory()->createJsonResponse(['registered' => true]);
}
}

With Attachments

use Larafony\Mail\Symfony\EmailConverter;
use Larafony\Mail\Symfony\Transport\SymfonyTransport;
use Symfony\Component\Mime\Email;

#[Route('/invoices/<id:\d+>/send', methods: ['POST'])]
public function sendInvoice(SymfonyTransport $transport, ViewManager $viewManager, int $id): ResponseInterface
{
$invoice = Invoice::find($id);

// Build email using Mailable (renders Blade view)
$mailable = new InvoiceMail($invoice);
$larafonyEmail = $mailable->withViewManager($viewManager)->build();

// Convert to Symfony Email and add attachments
$symfonyEmail = EmailConverter::toSymfony($larafonyEmail)
->attachFromPath(storage_path("invoices/{$invoice->number}.pdf"))
->priority(Email::PRIORITY_HIGH);

$transport->sendSymfonyEmail($symfonyEmail);

return new ResponseFactory()->createJsonResponse(['sent' => true]);
}

Features