Full email support out of the box with sending, templates, and notification-driven delivery. The transport is swappable, so you can start with a free provider and move to something else as needs change.
The starter uses Resend as the default mail transport. It has a free tier (100 emails/day), a clean API, and a community Laravel driver. There are plenty of alternatives (Mailgun, Postmark, Amazon SES) but Resend lets you get a fully working email setup at zero cost, which is ideal for a starter project. Swapping to another provider later is just a driver and env var change.
For a complete email setup beyond just sending, two other services pair well with Resend:
Cloudflare Email Routing for inbound forwarding. It's free with no per-email limits. Set up addresses like [email protected] and forward them to your personal inbox. This is a DNS-level feature, not a Laravel concern, but worth knowing about when you're setting up a new project.
Gmail "Send mail as" for replying from custom addresses. Add your custom address in Gmail's account settings and point it at Resend's SMTP credentials. Replies go out through Resend looking like they came from [email protected], and incoming replies land back in Gmail via Cloudflare forwarding.
All emails in the starter go through Laravel's notification system rather than Mail::send(). Each notification class defines which channels it uses (email, database, or both) and the content for each.
This keeps email delivery consistent and extensible. Adding SMS or other channels later is just a matter of updating the $channelMap in each notification class. The notification approach also means every email automatically participates in the in-app notification system when configured to use the database channel alongside mail.
If you just want to restyle the emails globally (colors, logo, fonts, footer) without changing the content structure, publish the vendor templates.
php artisan vendor:publish --tag=laravel-mail
This copies templates into resources/views/vendor/mail/. Two directories are created, html/ for the HTML versions and text/ for plain text fallbacks. The main layout is message.blade.php and the rest are partials like button, header, footer, panel, and table.
Changes here apply to every email the app sends. The content of each email still comes from its notification class.
If the default layout components don't cut it and you want complete control over the HTML, you can point any notification at its own Blade view instead of using ->line() and ->action().
public function toMail($notifiable): MailMessage
{
return (new MailMessage)->view('emails.reset-password', [
'url' => $this->resetUrl($notifiable),
'expiry' => config('auth.passwords.users.expire'),
]);
}
Create the view at resources/views/emails/reset-password.blade.php with whatever HTML you want. This completely bypasses the default layout components, so you own the entire email markup.