Lời nói đầu
Đầu xuân năm mới mình chợt nảy ra một ý định là sẽ gửi mail chúc mừng năm mới đến những người quen của mình, và đồng thời mình cũng nhận ra là trong series Laravel project của mình chưa đề cập đến chức năng cực kì quan trọng này. Vì vậy mình quyết định viết về một chức năng mà chắc chắn rằng trang web nào cũng sẽ cần đến.
- Khi đăng kí tài khoản trên 1 website, việc đầu tiên là bạn sẽ phải vào mail để kích hoạt tài khoản.
- Khi khách hàng đặt hàng trên website của bạn, bạn cần gửi mail xác nhận đến cho khách hàng.
- Khi website có khuyến mãi, quảng cáo qua mail là một phương pháp cực kì đơn giản và hữu dụng.
- …
Như vậy bạn đã thấy sự thiết thực của của chức năng gửi mail chưa nào? Và ở bài viết này mình sẽ đi vào tìm hiểu 2 nội dung chính, đó là:
- Làm thế nào để có thể xay dựng được chức năng gửi mail?
- Làm thế nào để test xem chức năng gửi mail đã hoạt động đúng hay chưa?
Giờ thì cùng bắt tay vào việc thôi nào!
Nội dung
Xây dựng chức năng gửi mail
Bước đầu tiên, để gửi được email, bạn sẽ phải cài đặt Guzzle HTTP library thông qua composer nhé:
12composer require guzzlehttp/guzzleSau đó, chúng ta sẽ tạo một command để gọi chức năng gửi mail với câu lệnh:
12php artisan make:command SendMailta sẽ thu được file
appConsoleCommandsSendMail
có cấu trúc như sau:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Console<span class="token punctuation"></span>Commands</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Models<span class="token punctuation"></span>User</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>DripEmailer</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Mail<span class="token punctuation"></span>NewYearMail</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Support<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Mail</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Console<span class="token punctuation"></span>Command</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">SendMail</span> <span class="token keyword">extends</span> <span class="token class-name">Command</span><span class="token punctuation">{</span><span class="token comment">/*** The name and signature of the console command.** @var string*/</span><span class="token keyword">protected</span> <span class="token variable">$signature</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'email:newyear {user}'</span><span class="token punctuation">;</span><span class="token comment">/*** The console command description.** @var string*/</span><span class="token keyword">protected</span> <span class="token variable">$description</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Send Email for user'</span><span class="token punctuation">;</span><span class="token comment">/*** Create a new command 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 punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">parent</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">/*** Execute the console command.** @return mixed*/</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token variable">$user</span> <span class="token operator">=</span> User<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">find</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 function">argument</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'user'</span><span class="token punctuation">)</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">$user</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">NewYearMail</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 punctuation">}</span></span>Bước 2, chúng ta sử dụng câu lệnh
php artisan make:mail NewYearMail
để tạo class NewYearMail:1234567891011121314151617181920212223242526272829303132333435<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Mail</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Bus<span class="token punctuation"></span>Queueable</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Mail<span class="token punctuation"></span>Mailable</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Queue<span class="token punctuation"></span>SerializesModels</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Contracts<span class="token punctuation"></span>Queue<span class="token punctuation"></span>ShouldQueue</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">NewYearMail</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 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 punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//</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">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'mail.newyear'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">attach</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/public/images/2020-new-year.png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//đính kèm ảnh cùng với email</span><span class="token punctuation">}</span><span class="token punctuation">}</span></span>Bước 3, chúng ta sẽ tạo một blade cho nội dung của email:
12345678910111213141516171819@<span class="token function">section</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'styles'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>md<span class="token operator">-</span>contents <span class="token punctuation">{</span>font<span class="token operator">-</span>size<span class="token punctuation">:</span> <span class="token number">1</span>rem<span class="token punctuation">;</span><span class="token punctuation">}</span>@endsection@<span class="token function">section</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'content'</span><span class="token punctuation">)</span><span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"md-contents"</span><span class="token operator">></span><span class="token operator"><</span>p<span class="token operator">></span>Xin chào những người anh em thiện lành<span class="token punctuation">,</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span><span class="token operator"><</span>p<span class="token operator">></span>Nhân dịp năm mới Canh Tý <span class="token number">2020</span><span class="token punctuation">,</span> xin chúc anh chị và gia đình sức khoẻ dồi dào<span class="token punctuation">,</span>làm ăn phát đạt<span class="token punctuation">,</span> cuộc sống hạnh phúc<span class="token operator">!</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span>@endsection
Test chức năng gửi mail với Mailtrap
Trước hết hãy nói sơ qua về cách thức hoạt động của mailtrap đã nhé:
- Bình thường để check được nội dung mail thì bắt buộc phải gửi mail đi thì mới xem được. Nhưng để test chức năng thì bạn sẽ phải vừa sửa-vừa test liên tục dẫn đến việc sẽ bị spam hòm thư.
- Và Mailtrap giải quyết vấn đề đó bằng cách CÓ tạo mail, CÓ gửi đi nhưng sẽ BỊ GIỮ LẠI giữa đường và lưu trong hộp thư của mailtrap, không đến được người nhận nữa. Như vậy bạn sẽ tránh được tình trạng bị spam hộp thư hoặc sử dụng mail không có thật mà vẫn có thể check được nội dung các email gửi đi.
Sau khi bạn đăng kí tài khoản mailtrap thành công, truy cập vào bên trong hòm thư sẽ xuất hiện thông tin cấu hình như ảnh bên dưới. Và ở phần Integration thì bạn lựa chọn ngôn ngữ/framework tương ứng nhé. Như mình ở đây thì sẽ lựa chọn
Laravel
Sau đó copy phần thông tin cấu hình bên dưới (LÀM 1 TRONG 2 thứ thôi nhé) vào:
Cấu hình trong .env:
12345678<span class="token constant">MAIL_DRIVER</span><span class="token operator">=</span>smtp<span class="token constant">MAIL_HOST</span><span class="token operator">=</span>smtp<span class="token punctuation">.</span>mailtrap<span class="token punctuation">.</span>io<span class="token constant">MAIL_PORT</span><span class="token operator">=</span><span class="token number">2525</span><span class="token constant">MAIL_USERNAME</span><span class="token operator">=</span><span class="token number">4</span>f248571390ff8<span class="token constant">MAIL_PASSWORD</span><span class="token operator">=</span><span class="token number">15</span>be016776c0f8<span class="token constant">MAIL_FROM_ADDRESS</span><span class="token operator">=</span><a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a><span class="token punctuation">.</span>com<span class="token constant">MAIL_FROM_NAME</span><span class="token operator">=</span>ExampleHOẶC trong config/mail.php
1234567891011121314<span class="token php language-php"><span class="token delimiter important"><?php</span><span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token double-quoted-string string">"driver"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"smtp"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"host"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"smtp.mailtrap.io"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"port"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">2525</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"from"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"address"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"name"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"Example"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"username"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"4f248571390ff8"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"password"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"15be016776c0f8"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"sendmail"</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token double-quoted-string string">"/usr/sbin/sendmail -bs"</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
Cài đặt mailtrap cũng chỉ đơn giản như vậy thôi, giờ thì cùng test thử xem nó đã hoạt động chưa nhé!
Giờ chúng ta sẽ chạy câu lệnh php artisan email:newyear 1
để gửi email cho user có id=1 và đây là kết quả mình thu được:
Tổng kết
Sau bài viết này, hi vọng các bạn đã có thể xay dựng được chức năng gửi email theo đúng ý trong sản phẩm website của mình. Nếu có bất cứ khó khăn gì trong quá trình thực hiện, bạn có thể comment xuống phía dưới hoặc đăng câu hỏi lên viblo để mọi người hỗ trợ nhé!
Cảm ơn các bạn đã theo dõi và hãy ủng hộ mình trong những bài viết tiếp theo nhé!
Tài liệu tham khảo
- Trang chủ: https://mailtrap.io/
- Laracast: https://laracasts.com
- Send mail Laravel: https://blog.mailtrap.io/send-email-in-laravel/
- Mailtrap và Testing: https://viblo.asia/p/mailtrap-va-testing-xQMGJmgNvam