{"id":492,"date":"2025-08-29T07:35:38","date_gmt":"2025-08-29T07:35:38","guid":{"rendered":"https:\/\/1v0.net\/blog\/?p=492"},"modified":"2025-08-29T07:35:40","modified_gmt":"2025-08-29T07:35:40","slug":"how-to-send-emails-in-laravel-with-smtp-mailgun-and-postmark","status":"publish","type":"post","link":"https:\/\/1v0.net\/blog\/how-to-send-emails-in-laravel-with-smtp-mailgun-and-postmark\/","title":{"rendered":"How to Send Emails in Laravel with SMTP, Mailgun, and Postmark"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>How to Send Emails in Laravel with SMTP, Mailgun, and Postmark<\/strong><\/h2>\n\n\n\n<p>Sending emails is a core feature for many applications\u2014whether it\u2019s delivering account confirmations, password reset links, or notifications. Laravel 12 makes email delivery simple with its built-in <code>Mail<\/code> system and support for multiple drivers such as <strong>SMTP<\/strong>, <strong>Mailgun<\/strong>, and <strong>Postmark<\/strong>. In this guide, you\u2019ll learn how to configure each driver, send your first email, use a mailable inside a controller, trigger emails from events, and test email delivery in your project.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Configuring SMTP in Laravel<\/strong><\/h2>\n\n\n\n<p>SMTP (Simple Mail Transfer Protocol) is one of the most common ways to send emails. Laravel provides an SMTP driver out of the box. Open your <code>.env<\/code> file and add the following configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">MAIL_MAILER=smtp\nMAIL_HOST=smtp.mailtrap.io\nMAIL_PORT=587\nMAIL_USERNAME=your_smtp_username\nMAIL_PASSWORD=your_smtp_password\nMAIL_ENCRYPTION=tls\nMAIL_FROM_ADDRESS=no-reply@example.com\nMAIL_FROM_NAME=<span class=\"hljs-string\">\"My App\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This sample uses Mailtrap for safe testing. In production, replace with your provider (e.g., Gmail SMTP, SendGrid). <code>MAIL_FROM_*<\/code> values define the default sender for outgoing mail.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sending Emails with Mailables<\/strong><\/h2>\n\n\n\n<p>Laravel uses <strong>Mailables<\/strong> to structure, render, and send emails. Generate one with Markdown support:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">php artisan make:mail WelcomeMail --markdown=emails.welcome<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This command creates a mailable and a Markdown Blade view so you can style emails quickly and consistently.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Mail<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Bus<\/span>\\<span class=\"hljs-title\">Queueable<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Mail<\/span>\\<span class=\"hljs-title\">Mailable<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Queue<\/span>\\<span class=\"hljs-title\">SerializesModels<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">WelcomeMail<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Mailable<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Queueable<\/span>, <span class=\"hljs-title\">SerializesModels<\/span>;\n\n    <span class=\"hljs-keyword\">public<\/span> $user;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">($user)<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;user = $user;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">build<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;subject(<span class=\"hljs-string\">'Welcome to My App'<\/span>)\n                    -&gt;markdown(<span class=\"hljs-string\">'emails.welcome'<\/span>)\n                    -&gt;with(&#91;\n                        <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-keyword\">$this<\/span>-&gt;user-&gt;name,\n                    ]);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>build()<\/code> sets the subject, selects the Markdown template, and passes data (<code>name<\/code>) to the view for personalization.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Using a Mailable Inside a Controller<\/strong><\/h2>\n\n\n\n<p>Send the <code>WelcomeMail<\/code> right after user registration from your controller:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Mail<\/span>\\<span class=\"hljs-title\">WelcomeMail<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">User<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Request<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Mail<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RegisterController<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Controller<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">store<\/span><span class=\"hljs-params\">(Request $request)<\/span>\n    <\/span>{\n        $user = User::create($request-&gt;validate(&#91;\n            <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255'<\/span>,\n            <span class=\"hljs-string\">'email'<\/span> =&gt; <span class=\"hljs-string\">'required|email|unique:users'<\/span>,\n            <span class=\"hljs-string\">'password'<\/span> =&gt; <span class=\"hljs-string\">'required|min:8'<\/span>\n        ]));\n\n        Mail::to($user-&gt;email)-&gt;send(<span class=\"hljs-keyword\">new<\/span> WelcomeMail($user));\n\n        <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'\/home'<\/span>)-&gt;with(<span class=\"hljs-string\">'success'<\/span>, <span class=\"hljs-string\">'Account created and welcome email sent!'<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This keeps the flow simple: create the user, then send the email. For larger apps, consider events to decouple email logic from controllers.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Using a Mailable with Events<\/strong><\/h2>\n\n\n\n<p>Events and listeners separate concerns and make registration extensible (send email, log analytics, etc.). Generate an event and a listener:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">php artisan make:event UserRegistered\nphp artisan make:listener SendWelcomeEmail --event=UserRegistered<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These commands scaffold a <code>UserRegistered<\/code> event and a <code>SendWelcomeEmail<\/code> listener that will react to the event.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Events\/UserRegistered.php<\/span>\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Events<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">User<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Foundation<\/span>\\<span class=\"hljs-title\">Events<\/span>\\<span class=\"hljs-title\">Dispatchable<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Queue<\/span>\\<span class=\"hljs-title\">SerializesModels<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UserRegistered<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Dispatchable<\/span>, <span class=\"hljs-title\">SerializesModels<\/span>;\n\n    <span class=\"hljs-keyword\">public<\/span> $user;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">(User $user)<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">$this<\/span>-&gt;user = $user;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The event carries the <code>User<\/code> instance so listeners have everything needed to perform follow-up actions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Listeners\/SendWelcomeEmail.php<\/span>\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Listeners<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Events<\/span>\\<span class=\"hljs-title\">UserRegistered<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Mail<\/span>\\<span class=\"hljs-title\">WelcomeMail<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Mail<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SendWelcomeEmail<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">handle<\/span><span class=\"hljs-params\">(UserRegistered $event)<\/span>: <span class=\"hljs-title\">void<\/span>\n    <\/span>{\n        Mail::to($event-&gt;user-&gt;email)\n            -&gt;send(<span class=\"hljs-keyword\">new<\/span> WelcomeMail($event-&gt;user));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The listener\u2019s <code>handle()<\/code> method receives the event, then dispatches the <code>WelcomeMail<\/code> to the new user\u2019s email address.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Providers\/EventServiceProvider.php<\/span>\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Providers<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Foundation<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Providers<\/span>\\<span class=\"hljs-title\">EventServiceProvider<\/span> <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">ServiceProvider<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Events<\/span>\\<span class=\"hljs-title\">UserRegistered<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Listeners<\/span>\\<span class=\"hljs-title\">SendWelcomeEmail<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">EventServiceProvider<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">ServiceProvider<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">protected<\/span> $listen = &#91;\n        UserRegistered::class =&gt; &#91;\n            SendWelcomeEmail::class,\n        ],\n    ];\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Registering the mapping in <code>$listen<\/code> tells Laravel to run <code>SendWelcomeEmail<\/code> whenever <code>UserRegistered<\/code> is dispatched.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ app\/Http\/Controllers\/RegisterController.php<\/span>\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Events<\/span>\\<span class=\"hljs-title\">UserRegistered<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">store<\/span><span class=\"hljs-params\">(Request $request)<\/span>\n<\/span>{\n    $user = User::create($request-&gt;validate(&#91;\n        <span class=\"hljs-string\">'name'<\/span> =&gt; <span class=\"hljs-string\">'required|string|max:255'<\/span>,\n        <span class=\"hljs-string\">'email'<\/span> =&gt; <span class=\"hljs-string\">'required|email|unique:users'<\/span>,\n        <span class=\"hljs-string\">'password'<\/span> =&gt; <span class=\"hljs-string\">'required|min:8'<\/span>\n    ]));\n\n    UserRegistered::dispatch($user);\n\n    <span class=\"hljs-keyword\">return<\/span> redirect(<span class=\"hljs-string\">'\/home'<\/span>)-&gt;with(<span class=\"hljs-string\">'success'<\/span>, <span class=\"hljs-string\">'Account created successfully!'<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now the controller only fires an event. The listener handles email sending, improving testability and maintainability.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Mailgun Configuration<\/strong><\/h2>\n\n\n\n<p>Use Mailgun for transactional delivery by setting these variables in <code>.env<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">MAIL_MAILER=mailgun\nMAILGUN_DOMAIN=your-domain.com\nMAILGUN_SECRET=your-mailgun-key\nMAILGUN_ENDPOINT=api.mailgun.net<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>With <code>MAIL_MAILER=mailgun<\/code>, all <code>Mail::to(...)-&gt;send(...)<\/code> calls route through Mailgun\u2019s API transport.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Postmark Configuration<\/strong><\/h2>\n\n\n\n<p>Postmark focuses on high deliverability. Configure it like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">MAIL_MAILER=postmark\nPOSTMARK_TOKEN=your-postmark-server-token\nMAIL_FROM_ADDRESS=hello@yourdomain.com\nMAIL_FROM_NAME=<span class=\"hljs-string\">\"My App\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Once active, Laravel will send via Postmark\u2014helpful for critical emails like password resets and receipts.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testing Emails with PHPUnit<\/strong><\/h2>\n\n\n\n<p>Use fakes to test behavior without sending real mail. Here we verify that the event triggers the welcome email:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Tests<\/span>\\<span class=\"hljs-title\">Feature<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Tests<\/span>\\<span class=\"hljs-title\">TestCase<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Events<\/span>\\<span class=\"hljs-title\">UserRegistered<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Mail<\/span>\\<span class=\"hljs-title\">WelcomeMail<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Models<\/span>\\<span class=\"hljs-title\">User<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Mail<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Event<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Foundation<\/span>\\<span class=\"hljs-title\">Testing<\/span>\\<span class=\"hljs-title\">RefreshDatabase<\/span>;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MailTest<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">TestCase<\/span>\n<\/span>{\n    <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">RefreshDatabase<\/span>;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">test_event_triggers_welcome_email<\/span><span class=\"hljs-params\">()<\/span>\n    <\/span>{\n        Mail::fake();\n        Event::fake();\n\n        $user = User::factory()-&gt;create();\n\n        UserRegistered::dispatch($user);\n\n        Event::assertDispatched(UserRegistered::class);\n\n        Mail::assertSent(WelcomeMail::class, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">($mail)<\/span> <span class=\"hljs-title\">use<\/span> <span class=\"hljs-params\">($user)<\/span> <\/span>{\n            <span class=\"hljs-keyword\">return<\/span> $mail-&gt;hasTo($user-&gt;email);\n        });\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We fake both subsystems, assert the event was dispatched, and confirm the expected mailable was sent to the right recipient.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">PHPUnit 10.*\/Laravel Test Runner\n\n   PASS  Tests\\Feature\\MailTest\n  \u2713 test_event_triggers_welcome_email\n\n  Tests:  1 passed\n  Assertions: 2\n  Time: 0.41s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This output indicates a successful run\u2014your event fired and your mailable was sent, all without hitting external mail services.<\/p>\n\n\n\n<div class=\"wp-block-spacer\" style=\"height:100px\" aria-hidden=\"true\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wrapping Up<\/strong><\/h2>\n\n\n\n<p>You configured SMTP, Mailgun, and Postmark; created a reusable mailable; sent it from a controller; refactored to events and listeners for clean separation; and tested the flow with fakes. This foundation ensures reliable, maintainable email delivery in production.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What\u2019s Next<\/strong><\/h2>\n\n\n\n<p>Explore more advanced communication and notification patterns:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"\/blog\/mastering-laravel-notifications-mail-sms-slack\">Mastering Laravel Notifications: Mail, SMS, and Slack<\/a><\/li>\n<li><a href=\"\/blog\/laravel-events-listeners-complete-guide\">Laravel Events and Listeners: A Complete Guide<\/a><\/li>\n<li><a href=\"\/blog\/how-to-queue-emails-in-laravel-for-faster-delivery\">How to Queue Emails in Laravel for Faster Delivery<\/a><\/li>\n<\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p>How to Send Emails in Laravel with SMTP, Mailgun, and Postmark Sending emails is a core feature for many applications\u2014whether it\u2019s delivering account confirmations, password reset links, or notifications. Laravel 12 makes email delivery simple with its built-in Mail system and support for multiple drivers such as SMTP, Mailgun, and Postmark. In this guide, you\u2019ll [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":496,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[61,88,90,89],"class_list":["post-492","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-mail","tag-mailgun","tag-postmark","tag-smtp"],"_links":{"self":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/comments?post=492"}],"version-history":[{"count":1,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/492\/revisions"}],"predecessor-version":[{"id":495,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/posts\/492\/revisions\/495"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media\/496"}],"wp:attachment":[{"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/media?parent=492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/categories?post=492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1v0.net\/blog\/wp-json\/wp\/v2\/tags?post=492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}