Send mail in Laravel using MailHog
- Tram Ho
Hello everyone, when developing a web application, mailing tasks are used very often, so today, I will show you how to send mail in Laravel using MailHog . In actual work, there will be a lot of tools to use for sending mail such as Mailtrap, MailHog,… but I suggest you to use MailHog, because it only sends under local machine so it will avoid some security issues later (in the past I used to use Mailtrap because it was quite convenient and was told by the guys in the company )
Steps to take
Install Laravel App
In this article, I will use Laravel 8 to perform, first run the familiar command to install the Laravel application.
1 2 3 4 5 6 | composer create-project laravel/laravel mail-app cd mail-app php artisan serve |
Create routes and interfaces
Before creating a route, you need to create a controller for sending mail by command
1 2 | php artisan make:controller MailController |
After creating the controller, we add a mail router and make a simple interface for sending mail, including 2 inputs, the recipient’s email address, and the content we want to send.
1 2 3 4 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/mail'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>MailController<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'index'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/mail'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>MailController<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'sendMail'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">name</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'send_mail'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Make email delivery
1. Install MailHog
To send mail, you need to install MailHog, you can go to its docs to see it https://github.com/mailhog/MailHog. Here I will install using docker with Docker file as below.
1 2 3 4 5 6 7 8 | <span class="token keyword">FROM</span> mailhog/mailhog <span class="token keyword">LABEL</span> maintainer=<span class="token string">"Mahmoud Zalt <mahmoud@zalt.me>"</span> <span class="token keyword">CMD</span> <span class="token punctuation">[</span><span class="token string">"Mailhog"</span><span class="token punctuation">]</span> <span class="token keyword">EXPOSE</span> 1025 8025 |
Do a docker image build and run on port 1025 and 8025
1 2 3 | docker build . docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog |
2. Configure MailHog in .env
1 2 3 4 5 6 7 8 9 | MAIL_MAILER=smtp MAIL_HOST=127.0.0.1 MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=laravel.admin@gmail.com MAIL_FROM_NAME="${APP_NAME}" |
3. Make a Mailable
Execute the command below to create a mailable, it will be saved in folder app/Mail
1 2 | php artisan make:mail SendMail |
In function build you can set email like from
, view
, with
, attach
, … In the code below, I send email with subject
is “Send mail contact!” use markdown
in file resources/views/Mails/send_mail.blade.php
and receive data through __construct
and assign to variable $this->data
(Remember to let the public file view be able to receive it)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token keyword">class</span> <span class="token class-name">SendMail</span> <span class="token keyword">extends</span> <span class="token class-name">Mailable</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">,</span> SerializesModels<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$data</span><span class="token punctuation">;</span> <span class="token comment">/** * Create a new message instance. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">data</span> <span class="token operator">=</span> <span class="token variable">$data</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Build the message. * * @return $this */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">subject</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Send mail contact!'</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">markdown</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Mails.send_mail'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
In the view file, I will create a simple information to display the email content. Out $data
is $this->data
in the above mailable file.
1 2 3 4 5 6 7 8 | @<span class="token function">component</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'mail::message'</span><span class="token punctuation">)</span> <span class="token shell-comment comment"># Hello {{ $data['email'] }}</span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'content'</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">}</span> Thanks<span class="token operator"><</span>br<span class="token operator">></span> @endcomponent |
4. Send mail in controller
After user enters email and content and press submit, we will redirect to function sendMail
in MailController
, Here, remember to add validate required
for email
and content
Please
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">class</span> <span class="token class-name">MailController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">sendMail</span><span class="token punctuation">(</span>Request <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Mail<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">to</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">email</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SendMail</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">only</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'email'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'content'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">session</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">flash</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'message'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Send mail was successful!'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Mails.index'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Result
Summary
Sending mail needs to be careful, it may be wrong to send mail to end users, to users of the whole system, … so it must be re-tested when performing. In addition, sending mail will take a long time for the application to load, so you should use Queues for sending mail. Thank you everyone for following my post.