Send mail trong Laravel sử dụng MailHog
- Tram Ho
Xin chào mọi người, khi phát triển một ứng dụng web thì các tác vụ gửi mail được sử dụng rất thường xuyên nên hôm nay, mình sẽ gửi đến mọi người cách để gửi mail trong Laravel sử dụng MailHog . Trong làm việc thực tế, sẽ có rất nhiều công cụ để dùng cho gửi mail như Mailtrap, MailHog,… nhưng mình đề xuất cho các bạn sử dụng MailHog, vì nó chỉ gửi ở dưới máy local nên sẽ tránh được 1 số vấn đề bảo mật sau này (lúc trước mình thường dùng Mailtrap vì nó khá tiện và đã bị các anh trong công ty nói)
Các bước thực hiện
Cài đặt ứng dụng Laravel
Ở bài viết này mình sẽ sử dụng Laravel 8 để thực hiện, đầu tiên chạy câu command quen thuộc để thực hiện cài đặt ứng dụng Laravel nhé.
1 2 3 4 5 6 | composer create-project laravel/laravel mail-app cd mail-app php artisan serve |
Tạo route và giao diện
Trước khi tạo 1 route, thì các bạn thực hiện tạo 1 controller dùng cho việc gửi mail bằng command
1 2 | php artisan make:controller MailController |
Sau khi tạo xong controller thì chúng ta thêm 1 router mail và thực hiện làm 1 giao diện đơn giản cho việc gửi mail gồm 2 input là địa chỉ email người nhận vào nội dung muốn gửi.
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> |
Thực hiện gửi mail
1. Cài đặt MailHog
Để thực hiện gửi mail các bạn cần phải thực hiện cài đặt MailHog, các bạn có thể lên lên docs của nó để xem nhé https://github.com/mailhog/MailHog. Ở đây mình sẽ cài đặt bằng docker với Dockerfile như bên dưới.
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 |
Thực hiện build docker image và chạy ở port 1025 và 8025
1 2 3 | docker build . docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog |
2. Cấu hình MailHog trong .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. Thực hiện tạo một Mailable
Thực hiện command bên dưới để tạo 1 mailable, nó sẽ được lưu trong folder app/Mail
1 2 | php artisan make:mail SendMail |
Ở trong function build các bạn có thể setting cho email như from
, view
, with
, attach
, … Ở đoạn code dưới đây mình thực hiện gửi mail có subject
là “Send mail contact!” sử dụng markdown
trong file resources/views/Mails/send_mail.blade.php
và nhận data thông qua __construct
và gán vào biến $this->data
(nhớ để pubic file view có thể nhận được nha)
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> |
Ở file view thì mình sẽ tạo 1 thông tin đơn giản để hiển thị nội dung mail nhé. Biến $data
chính là $this->data
ở file mailable phía trên.
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. Thực hiện gửi mail ở controller
Sau khi người dùng nhập email và content rồi nhấn submit, chúng ta sẽ chuyển hướng đến function sendMail
trong MailController
, ở đây các bạn nhớ thêm validate required
cho email
và content
nhé
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> |
Kết quả
Tổng kết
Việc gửi mail cần phải cẩn thận, có thể bị gửi mail nhầm cho end users, cho user toàn hệ thống, … vì vậy phải test lại cần thận khi thực hiên. Ngoài ra, việc gửi mail sẽ khiến cho ứng dụng load khá lâu, nên bạn nên sử dụng Queues cho việc gửi mail nhé. Cảm ơn mọi người đã theo dõi bài viết của mình.