Share

Gửi email bằng MailGun

Hướng dẫn gửi email bằng Mailgun, sử dụng thư viện PHP để gọi các API và gửi một email đơn giản, có thể đính kèm file.

Việc gửi email vốn không có gì gọi là xa lạ với chúng ta nữa, gần như project nào cũng cần, khách hàng nào cũng yêu cầu. Và nó trở nên quá bình thường như đánh răng, rửa mặt. Rồi chúng ta viết nó thành các thư viện để có thể dùng đi dùng lại nhiều lần. Nên nhiều lúc cũng quên mất là ta đang gửi email theo cách nào luôn. Vậy hôm nay ta sẽ tìm lại một thời ký ức với một tâm thế mới.

Cách gửi email đơn giản

Hồi mới bắt đầu học web, mình được dạy cách gửi email đơn giản và thông dụng nhất là gửi bằng hàm mail() mặc định của php, hoặc cấu hình SMTP để gửi. Lý do được khuyến cáo dùng hàm mail() là vì nó cho phép cấu hình ở phía server đễ hỗ trợ cái gì đó cao cấp hơn, Đại loại như mail server, log hay cái gì đó.

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Ở trên là mô tả cú pháp của hàm, còn dưới đây là một ví dụ :

<?php
$to      = 'nobody@senviet.org';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@senviet.org' . "\r\n" .
    'Reply-To: webmaster@senviet.org' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

Và chắc bạn không quên PHPMailer – một thư viện huyền thoại dành cho email, khi nó được sử dụng trong rất nhiều dự án, WordPress là một trong số đó. Bạn đọc thêm về nó tại : PHPMailer.

Tuy nhiên, gửi email cũng ảnh hưởng tới server, vì vậy có một vài nhà cung cấp đã tắt dịch vụ gửi email, tắt luôn hàm mail và smtp. Nhưng trường hợp này không quá nhiều. Một vấn đề khác, là khi bạn sử dụng shared host với shared IP, nghĩa là toàn bộ site trên server mà bạn đang sử dụng đều gửi email từ cùng một IP, giả như các site khác gửi email spam, thì IP của server sẽ bị nhận dạng là spam và tất nhiên, email của bạn sẽ bị cho vào thùng rác. Trong trường hợp này, bạn nên tìm một cách gửi email mới.

Một tiêu chí mới để bạn tìm tới dịch vụ gửi email của bên thứ ba chính là thống kê. Gửi email cũng cần phải thống kê, xem có bao nhiêu người mở email, bao nhiêu người nhận email chứ đúng không ? Nếu chỉ cấu hình đơn giản, thì việc gửi bằng hàm mail và smtp sẽ không thể thống kê được. Bạn nên tìm một dịch vụ gửi email của bên thứ ba. Trong trường hợp của bài viết này thì đó là Mailgun

Mailgun là gì và cách đăng ký

Mail gun là gì ?

Mailgun là một dịch vụ gửi email của bên thứ ba mà mình nói với bạn ở đầu bài, dịch vụ này sẽ đảm nhiệm phần gửi email cho bạn, bạn chỉ cần gửi các API request lên server của mailgun, tất nhiên là bạn phải có API của nó. Dịch vụ Mailgun tự nhận là được thiết kế để dành cho developer, với chính sách thoải mái, lượng email được phép gửi cao, và thời gian đáp ứng tốt, mình nghĩ nó đang để thử, còn một dịch vụ khác nữa là Mandrill, mình cũng rất thích nó, nhưng chúng ta sẽ nói về nó ở một bài viết khác. Còn bây giờ, bạn hãy bắt đầu tạo account tại Mailgun.

Cách đăng ký account

Bạn truy cập vào trang Đăng ký account Mailgun để tạo một tài khoản, việc tạo tài khoản tương đối đơn giản, giống như các dịch vụ bình thường khác :

Mailgun register form
Form đăng ký mailgun

Mailgun không yêu cầu bạn nhập thông tin thanh toán khi đăng ký, bạn được miễn phí 10k email mỗi tháng, nếu vượt quá số này thì email của bạn sẽ không được gửi đi, lúc đó việc gửi email trên website của bạn sẽ bị gián đoạn, nếu yêu cầu của bussiness không cho phép gián đoạn, thì bạn nên nhập thông tin thánh toán ngay lúc này,  Mailgun sẽ chỉ trừ tiện bạn nếu số email vượt quá thôi.

Sau khi đăng ký xong, bạn cần kích hoạt account bằng cách bấm vào link kích hoạt trong email mà mailgun sẽ gửi cho bạn ngay sau khi đăng ký. Giờ bạn có thể dạo qua một vòng dashboard để tìm hiểu. Sau khi tìm hiểu sơ lượt rồi, chúng ta sẽ cần phải lấy API của nó để sử dụng trong code.

Lấy api key

Sau khi đăng nhập xong, bạn cần phải add domain của bạn vào và xác thực nó,  nhưng nếu bạn chưa muốn, bạn cũng có thể tạm thời bỏ qua và gửi được 300 email một ngày, 10k email mỗi tháng. Đây là hướng dẫn đơn giản thôi, để bạn hiểu và có thể gửi được email, vì vậy mình sẽ bỏ qua bước xác minh email. Giờ bạn login và truy cập vào trang dashboard và kéo xuống cuối trang, bạn sẽ thấy như hình bên dưới, ấn show thì nó sẽ hiện ra API key, bạn lưu lại để dùng cho bước tiếp theo :

Mailgun dashboard API
Lấy API

Cài đặt code Mailgun trong PHP

Vì là dành cho developer, nên chắc chắn rằng Mailgun phải viết một thư viện trên đủ thứ ngôn ngữ lập trình, mà trong đó có PHP, Thư viện PHP này được quản lý ở Github. API của Mailgun được viết với composer, Chỉ cần một lệnh command line duy nhất là mọi thứ đã sẵn sàng cho bạn sử dụng. Nếu bạn chưa biết composer, hoặc ngại cực khi cài nó, thì bạn nên nghĩ lại, vì hiện tại, phần lớn các thư viện đều sử dụng composer, vì những lợi ích mà nó đem lại là rất lớn.

Tuy nhiên vẫn có cách thay thế, dù nó không tốt bằng, nhưng vẫn có thể sử dụng được, đó là tải một project đã được chạy composer sẵn rồi, bạn không cần phải chạy lại nữa. Dưới đây mình sẽ hướng dẫn bằng hai cái.

Cài đặt bằng cách tải file

Mailgun đã lường trước trường hợp các bạn lười, hoặc vì nhiều lý do như internet chậm, cài composer mất thời gian …. Vì vậy họ đã chạy composer sẵn rồi nén code đó lại cho các bạn, bạn sẽ không cần phải chạy compser nữa, chỉ cần tải file nén về rồi sử dụng thôi, Bạn tải file theo link bên dưới. Giải nén ra và ta sẽ đến bước tiếp theo :

Cài đặt mailgun bằng composer

Mình khuyến khích sử dụng cách này. Đầu tiên bạn cần tạo thư mục cho project ở trong thư mục webserver của bạn. Ở đây mình sẽ chọn tên thư mục là mailgunExample. Sau đó mở command line trong thư mục này và sử dụng lệnh :

composer&amp;amp;nbsp;require mailgun/mailgun-php

Việc tải các file thư viện có lẽ sẽ mất một khoản thời gian. Sau khi composer chạy xong, bạn sẽ có mọi thứ mình cần để chuyển qua bước tiếp theo. Kết quả của cách này cũng giống hệt như cách tải file.

Gửi email bằng Mailgun

Chỉ với một dòng lệnh và mọi thứ đã sẵn sàng cho chúng ta, giờ chỉ việc gọi nó lên và sử dụng như trong hướng dẫn tại : API Reference.  Khi xem tài liệu, bạn nhớ chọn vào mục PHP nhé, hư vậy thì các ví dụ sẽ code bằng PHP. Còn giờ chúng ta sẽ bắt đầu với project nho nhỏ của mình.

bạn cần tạo file index.php ở thư mục gốc của project với nội dung như sau :

&amp;amp;lt;?php
/**
 * Send email using Mailgun
 * Description.
 * @author nguyenvanduocit
 */
require_once __DIR__.'/vendor/autoload.php';
use Mailgun\Mailgun;
$mailGun = new Mailgun('key-4738bfd164ba528aa140ed244c949adc');

Ở file nào bạn cũng nên viết comment ở đầu file để ghi chú về mục đích của flie, mô tả và thông tin người viết nó, điều này sẽ giúp ích rất nhiều về sau. Dòng code đầu tiên mình require file autoload do composer tạo ra, file này sẽ tự động load file tương ứng với class mà bạn gọi. ở dòng tiếp theo mình dùng từ khóa user để khai báo sử dụng class Mailgun, giúp rút ngắn việc gọi tên class ở những dòng sau. Tiêp theo mình tạo một instance của class Mailgun với tham số constructor là API key mà mình đã hướng dẫn bạn lấy hồi nảy. API key mà bạn đang thấy ở đây chỉ là tạm thời thôi, nên đừng thử dùng lại nó mất công nhé.

Giờ mình sẽ thêm đoạn code dưới đây để có thể gửi email ngay và luôn :

$emailArgs = array(
	'from'    =&gt; 'nguyenvanduocit@gmail.com',
	'to'      =&gt; 'nguyenvanduocit@gmail.com',
	'subject' =&gt; 'Test Email On Sen Việt',
	'text'    =&gt; 'Đây là một email thử nghiệm.',
);
$result = $mailGun-&gt;sendMessage( $domain, $emailArgs );
var_dump($result);

Bạn thay thế email của mình bằng email của bạn để có thể kiểm tra xem nó có hoạt động không, cũng thay luôn domain thành domain của bạn nhé ( domain sandbox ấy ). Giờ bạn truy cập vào địa chỉ có thể run file này. Nếu thành công thì bạn sẽ thấy kết quả giống giống như dưới đây :

object(stdClass)[33]
  public 'http_response_body' =&gt; 
    object(stdClass)[29]
      public 'id' =&gt; string '&lt;20150722155201.37697.8559@sandbox200561e0ba044f8096a8b4d2e347d62b.mailgun.org&gt;' (length=79)
      public 'message' =&gt; string 'Queued. Thank you.' (length=18)
  public 'http_response_code' =&gt; int 200

Reponse code là 200 có nghĩa là email đã được gửi thành công vào hệ thống của Mailgun, bạn cũng có thể xem thêm nhiều mã lỗi khác tại trang này. Nhưng đừng vội vào hộp thư kiểm tra, có thể nó chưa được gửi đâu, hãy xem flow khi gửi một email bằng mailgun như sau :

  1. Gọi client để submit một message
  2. Message sẽ được enqueue vào hệ thoogns của mailgun
  3. Chờ mailgun xử lý, thường thì chỉ mất chừng 5 giây.
  4. Mailgun gửi email đến người nhận

Chính vì bước 3, mà đôi khi bạn sẽ không thấy được email ngay lập tức, tùy theo điều kiện mà email có thể được gửi rất sớm hoặc khá trễ. Tuy nhiên việc bạn gọi API đã được log lại tại server của mailgun, bạn có thể vào dashboard của mình, vào phần log để xem trang thái các message mà bạn đã gửi, để vào trang log, bạn vào dashboard, rồi click vào menu Logs thật lớn ở đầu trang. Bạn sẽ đến trang giống như sau :

Login trong mailgun
Login trong mailgun

Đọc tới đây thì bạn đã có thể truy cập vào email và kiểm tra rồi đấy, bạn sẽ thấy email có tiêu đều là “Test Email ON Sen Việt”, trong email có nội dung “Đây là một email thử nghiệm.” Vậy là bạn đã thành công, giờ hãy xem còn những tham số nào nữa nhé:

Tham số Mô tả
to Địa chỉ email của người nhận,
Ví dụ: "Bob <bob@host.com>". Bạn có thể dùng dấu phẩy để phân cách nhiều địa chỉ nhận
Bạn có thể dùng tham số cc và bcc để gửi cc hoặc bcc cho người khác
message Chuỗi MIME của message. Bạn phải sử dụng
multipart/form-data để upload file đính kèm.
o:tag Tag của message
o:campaign ID của campaign.
o:deliverytime Lên lịch hẹn ngày sẽ gửi email, tối đa là 3 ngày trong tương lai
o:testmode Enables sending in test mode. Pass yes if needed.
See Sending in Test Mode
o:tracking Đặt là yes nếu bạn muốn theo dõi các sự kiện xảy ra với message của bạn như : queue, sent….
o:tracking-clicks Đăt yes nếu bạn muốn theo dõi hành động click vào các link trong email
o:tracking-opens Đặt là yes nếu bạn muốn theo dõi hành vi mở email của người dùng
h:X-My-Header h: kèm theo name của field trong phần email header, Ví dụ h:Reply-To sẽ tương ứng với :Reply-To trong header của email
v:my-var Cho phép bạn gửi dữ liệu dạng JSON đi kèm theo email.
Xem chi tiết lại Attaching Data to Messages

 Gửi attachment

Để gửi attachment cũng rất đơn giản, bạn chỉ cần cung cấp đường dẫn tới file mà bạn muốn đính kèm là được :

$emailArgs = array(
	'from'    =&amp;gt; 'nguyenvanduocit@gmail.com',
	'to'      =&amp;gt; 'nguyenvanduocit@gmail.com',
	'subject' =&amp;gt; 'Test Email On Sen Việt',
	'text'    =&amp;gt; 'Đây là một email thử nghiệm.',
	array(
		'attachment' =&amp;gt; array('/path/to/file.txt', '/path/to/file.txt')
	)
);

Xem thống kê

Việc gửi email cơ bản đã xong, bước tiếp theo là xem các thông kê từ email, đây là một key featured của các dịch vụ kiểu này. Đối với Mailgun, bạn truy cập vào dashboard và vào phần tracking, bạn sẽ thấy tất cả các thống kê về số lượng click và link trong email, số lượt mở email…

Mailgun tacking report
Mailgun tacking report

Lời kết

Gửi email bằng dịch vụ của bên thứ ba thực sự đem lại nhiều điều hanh, Bạn có thể biết được tình hình xem email, giờ xem email nhiều để có thể điều chỉnh lại giờ gửi email, Hoặc thống kê xem những liên kế, title như thế nào thì kích thích người nhận xem email, click vào link. Thực sự dịch vụ bên thứ ba này có nhiều cái lợi hơn là giảm tải cho server.

Đây chỉ là một ví dụ nhỏ và cơ bản nhất, mục đích của nó là để bạn biết cách gửi email bằng API của Mailgun, các API của Mailgun còn có thể làm được rất nhiều điều hữu ích nữa. Hãy tiếp tục tìm hiểu và ứng dụng vào các project của bạn nhé.