Trong bài viết trước mình đã hướng dẫn các bạn cách gửi mail sử dụng SendGrid (Xem chi tiết TẠI ĐÂY).
Tuy SendGrid hỗ trợ rất tốt nhưng nhược điểm của nó lại là mất phí và việc đăng ký tài khoản đôi khi còn khó khăn. Chính vì vậy hôm nay mình sẽ hướng dẫn các bạn gửi Mail bằng Gmail API hoàn toàn miễn phí của Google.
Cụ thể mình sẽ hướng dẫn bằng Postman và ASP.NET Core.
Chuẩn Bị
Các bạn cần chuẩn bị các đồ nghề sau:
- - Tài khoản Gmail
- - Postman (Download Tại Đây)
- - .NET Core 6 (Download Tại Đây)
- - Visual Studio 2022 hoặc Rider (Xem cách Crack Rider TẠI ĐÂY
-
Tạo Client ID & Client Secret
Chỗ này quan trọng các bạn làm theo từng bước như mình nhé
Đầu tiên truy cập vào https://console.cloud.google.com/getting-started

Chọn Select a project -> New Project

Nhập tên Project và nhận Create

Chọn Project vừa tạo rồi tìm kiếm Gmail API

Tại màn hình này các bạn chon Enable

Tiếp theo các bạn chon Oauth consent screen -> External -> Create

Điền các thông tin cho mục Oauth consent screen.
Lưu ý: App name không được chứa các tên các sản phẩm của Google. VD: Gmail, Google,...

Mục Scopes các bạn chọn như hình trên nhé

Tiếp đến là tạo Client ID và Client Secret ở mục Credentials -> OAuth client ID

Tại màn hình này các bạn điền các thông tin giống như mình. Ở mục Authorized Redirect URIs các bạn để URL nào cũng được, kể cả Localhost vẫn đc nhé.
Còn mình thì dùng đồ nhà bằng tên Website của mình luôn 😁

Click vào icon download các bạn sẽ thấy Client ID và Client Secret vừa tạo

Các bạn lưu 2 thông tin Client ID và Client Secret lại để dùng sau.
Bây giờ hãy Publish App như sau:

Lấy Access Code
Để sử dụng được Gmail API thì trước hết chúng ta cần lấy được Access Token của tài khoản Gmail.
Các bạn mở trình duyệt web lên và truy cấp vào URL cùng các tham số như sau:
https://accounts.google.com/o/oauth2/auth?client_id=YOUR_CLIENT_ID&response_type=code&approval_prompt=force&access_type=offline&redirect_uri=YOUR_URI_REDIRECT&scope=https://mail.google.com/
Chú ý thay thế:
- - YOUR_CLIENT_ID: Client ID vừa tạo ở trên
- - YOUR_URI_REDIRECT: Chình là Authorized Redirect URIs ở trên
-
Để chắc chắn không copy và điền sai thông tin URL các bạn có thể sử dụng Tool URL Parser để Build URL bằng cách truy cập https://www.progcoder.com/tool/url-parser

https://accounts.google.com/o/oauth2/auth?client_id=YOUR_CLIENT_ID&response_type=code&approval_prompt=force&access_type=offline&redirect_uri=YOUR_URI_REDIRECT&scope=https://mail.google.com/
Paste URL trên vào mục thẻ Input -> Nhấn Parser -> Tại mục Query String Click button Edit -> Tiếp tục nhấn Build URL -> Cuối cùng hãy Copy lại URL ở phần Input.
Mở trình duyệt web và truy cấp vào URL vừa Copy.

Chọn đúng tài khoản bạn vừa dùng để tạo ở trên nhá.

Cảnh báo nhưng kệ cứ tiếp tục nhá các bạn

Tiếp tục xác nhận nhé.
Sau khi nhấn tiếp tục và thành công Google sẽ Redirect bạn về đúng URI mà bạn đã cung cấp ở trên kèm với một mã code như sau

Các bạn Copy mã Code và lưu lại.
Tránh tình trạng Copy sai value phần code thì các bạn có thể truy cập Tool URL Parser tại https://www.progcoder.com/tool/url-parser và làm như bước trên 😅
Lấy refresh_token
Sau khi lấy được Access Code như ở trên. Các bạn sử dụng Postman để lấy refresh_token bằng URL với Method là POST:
https://accounts.google.com/o/oauth2/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=https://www.progcoder.com&grant_type=authorization_code&code=YOUR_ACCESS_CODE
Kết quả sau khi request:

Các bạn lưu refresh_token lại nhá.
Lấy access_token
Tạo một request khác tới URL sau:
https://accounts.google.com/o/oauth2/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&refresh_token=YOUR_REFRESH_TOKEN&grant_type=refresh_token
Method POST
Kết quả trả về:

Với response như trên thì chúng ta sẽ sử dụng access_token để có thể tao tác với Gmail API như Gửi, Đọc, Lấy Danh Sách Mail.
Nhiều bạn sẽ thắc mắc là tại sao không sử dụng access_token ở bước Lấy refresh_token.
Lý do là vì Access Code và access_token chỉ có hiệu lực trong vòng 60 phút quá thời gian này cần tạo mới code và access_token mới để truy cập lại vào Gmail API. Chính vì vậy chúng ta cần lấy refresh_token trước và sử dụng nó để lấy access_token.
Thao Tác Với Gmail bằng Postman
Sau khi có access_token ở bước trên mình sẽ sử dụng để thao tác với Gmail. Các bạn có thể Download Collection và Import vào Postman của bạn để sử dụng nhé (Mình để ở cuối bài)
Gửi Mail
Có một lưu ý là phần Json Body khi gửi bằng Gmail API là thông tin gửi phải ở dạng String Base64. Ví dụ mình muốn gửi một email với nội dung và thôn tin như sau:
MIME-Version: 1.0
Content-type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
From: ProG Coder
To: Test User
Subject: =?UTF-8?B?Test Send Mail?=
This is test mail
Chúng ta sẽ cần Convert chuỗi trên sang Base64 thì mới có thể gửi đi được.
Mình có viết sẵn hàm Javascript để thực hiện việc này:
function buildMessage(subject, senderName, receiverName, from, to, htmlContent) {
// First, base64 encode the HTML content
var base64HtmlContent = btoa(htmlContent);
var inputBytes = unescape(encodeURIComponent(subject));
var base64Subject = btoa(inputBytes)
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
// Then, create the MIME message
var mimeMessage = [
'MIME-Version: 1.0',
'Content-type: text/html; charset=utf-8',
'Content-Transfer-Encoding: base64',
`From: ${senderName} <${from}>`,
`To: ${receiverName} <${to}>`,
`Subject: =?UTF-8?B?${base64Subject}?=`,
'',
base64HtmlContent
].join('\n');
// Finally, base64url encode the entire MIME message
var base64MimeMessage = btoa(mimeMessage)
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
return base64MimeMessage;
}
// Result: TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CkZyb206IFByb0cgQ29kZXIgPGRldnN0YXIub3JnQGdtYWlsLmNvbT4KVG86IFByb0cgQ29kZXIgVGVzdCA8cHJvZ2NvZGVyLmNvbUBnbWFpbC5jb20-ClN1YmplY3Q6ID0_VVRGLTg_Qj9WR1Z6ZENCVFpXNWtJRTFoYVd3Pz0KClBIQStWR2hwY3lCcGN5QjBaWE4wSUcxaGFXd3VJRk5sYm1RZ1lua2dVSEp2UnlCRGIyUmxjand2Y0Q0PQ
Bây giờ mình sẽ thực hiện gửi mail tới account [email protected] với nội dung là This is test mail. Send by ProG Coder
Json của mình sẽ có dạng sau:
{
"raw": "TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CkZyb206IFByb0cgQ29kZXIgPGRldnN0YXIub3JnQGdtYWlsLmNvbT4KVG86IFByb0cgQ29kZXIgVGVzdCA8cHJvZ2NvZGVyLmNvbUBnbWFpbC5jb20-ClN1YmplY3Q6ID0_VVRGLTg_Qj9WR1Z6ZENCVFpXNWtJRTFoYVd3Pz0KClBIQStWR2hwY3lCcGN5QjBaWE4wSUcxaGFXd3VJRk5sYm1RZ1lua2dVSEp2UnlCRGIyUmxjand2Y0Q0PQ"
}
Để gửi Mail bằng Gmail API chúng ta sẽ request tới URL
https://www.googleapis.com/gmail/v1/users/me/messages/send
Với các thông số sau:
- - Method: POST
- - Request Header: Authorization: Bearer access_token
- - Json Body: { "raw": "String_Base64" }
-


Kết quả sau khi gửi thành công:

Kiểm tra hộp thư đến trong Gmail sẽ thấy

Lấy danh sách Mail
Lấy danh sách Mail bằng bằng request tới URL:
https://www.googleapis.com/gmail/v1/users/me/messages/
Với các thông số sau:
- - Method: GET
- - Request Header: Authorization: Bearer access_token
-

Đọc Mail
Request tới URL sau để đọc Mail:
https://www.googleapis.com/gmail/v1/users/me/messages/EMAIL_ID
Với các thông số sau:
- - Method: GET
- - Request Header: Authorization: Bearer access_token
-

Thông tin chi tiết về mail sẽ được trả về như hình trên.
Các bạn sẽ thấy phần nội dung của Mail nằm trong payload -> body -> data. Do nó ở dạng Base64 nên chúng ta cần convert ra dạng có thể đọc.
Với Javascript các bạn có thể dụng hàm sau:
function decodeHtmlContent(base64HtmlContent) {
var base64 = base64HtmlContent
.replace(/-/g, '+')
.replace(/_/g, '/');
var htmlContent = atob(base64);
return htmlContent;
}
// Result:
Xem thêm các API khác của Gmail API tại https://developers.google.com/gmail/api/reference/rest/v1/users.messages/get
Tạm kết
Bài viết đến đây cũng khá dài rồi nên mình xin tạm dừng phần đầu tiên tại đây.
Ở phần tiếp theo mình sẽ hướng dẫn các bạn sử dụng Code với C#, .NET Core để gửi mail sử dụng Gmail API.
Các bạn nhớ theo dõi mình để không bỏ lỡ bài viết nào nhé