Trong các hệ thống giám sát, việc gửi email đến giám sát viên tức thời cũng là một phần hết sức quan trọng và thuận tiện vì sẽ không cần thiết phải giám sát hệ thống 24/7 mà vẫn nhận được cảnh báo sự cố ngay tức thời.

Tuy nhiên, việc xây dựng một email server hoạt động trơn tru với chi phí phải chăng không phải là chuyện đơn giản... nhất là trong những dự án đang tốn quá nhiều chi phí để hoạt động thì việc tiết kiệm cũng được nhà đầu tư rất quan tâm.

Với các yêu cầu đó, ta hoàn toàn có thể sử dụng Google Apps Script (GAS) để tận dụng dịch vụ Gmail của Google với sự ổn định đã được cam kết ^^!

I. Tổng quan về hệ thống

Hiện tại hệ thống mình đang phát triển sử dụng Slack để trao đổi cũng như nhận các thông báo của hệ thống. Vì thế hệ thống gửi cảnh báo sẽ được thiết kế như sau:

Monitoring System > Alert > Slack > Email

Hệ thống Slack bản thân cũng có sẵn notification ngay lập tức cho từng channel nhưng việc phải cài app > chỉnh setting ko phải ai cũng để ý, ngoài ra Slack còn bị giới hạn 10,000 messages mới nhất và sẽ bị ẩn đi (cho tới khi trả tiền) nên cũng hơi dở cho việc tra soát dù rất ít khi xảy ra.

II. Thiết lập hệ thống

1. Google Apps Script (GAS)

※ Cài đặt GAS

Đầu tiên, bạn cần vào Console của Google Cloud để bật Apps Script API lên và sử dụng.

GAS API

Sau đó truy cập vào Google Drive > Settings > Manage Apps > Install GAS.

GAS

※ Tạo GAS File

Sau khi cài đặt xong, ngay tại Google Drive. Ta chọn New > Google Apps Script. Khi đó một file Untitled Script sẽ được tạo ra và chúng ta nên đặt tên cho nó :D, ví dụ: System Alerting.

Để GAS có thể nhận được request từ bên ngoài gửi đến, ta cần sẽ cần khai báo hàm doPost(e) hoặc doGet(e), các ví dụ có thể tham khảo thêm tại đây.

function doPost(e) {
  const data = JSON.parse(e.postData.contents);
  console.log("slack event", JSON.stringify(data));

  // Handle data...
}

Giả sử ở ví dụ trên, ta dùng hàm doPost(e) để nhận POST request, e.postData.contents tuy là JSON nhưng là raw string nên ta sẽ parse về JSON Object để dễ thao tác. Sau khi có đầy đủ thông tin ta hoàn toàn có thể handle theo nhu cầu để chuẩn bị gửi thông tin đi.

Tip: bạn hãy sử dụng console.log() để ghi log, rất tiện lợi cho việc debug. Để xem log của console, ta vào View > Stackdriver Logging.

Sau khi handle data xong, ta sử dụng MaiApp API của GAS để gửi mail thông qua Gmail.

function doPost(e) {
  const data = JSON.parse(e.postData.contents);
  console.log("slack event", JSON.stringify(data));

  // Handle data...
  
  // Send mail
  const message = {
    noReply: true,
    to: 'server-team@company.com',
    subject: data.title,
    htmlBody: data.content
  };

  MailApp.sendEmail(message);
}

Cuối cùng, bạn sẽ deploy script dưới dạng web apps để sử dụng như một API. bằng cách chọn Publish > Deploy as web app với các thông số như bên dưới.

GAS Deploy

Ta sẽ sử dụng URL sau khi Deploy xong để dùng vào các hoạt động gửi email rất dễ dàng.

2. Thử nghiệm và sử dụng

Sau khi có URL dạng bên dưới, ta chỉ việc gửi request (có thể dùng Postman để thử nghiệm).

https://script.google.com/macros/s/AKfycbzpUnaedU4SUBhnUY_DNU64ws2lzgR4TdEi-4kglMvB0-B4yPgN/exec

Postman

Rất đơn giản phải không nào? Vậy là bạn đã có một Email API sử dụng Gmail mà sau đó có thể sử dụng mà không cần phải thiết lập quá nhiều bước SMTP và sử dụng được cho các hệ thống đặc thù như Slack...

Đánh giá

Chỉ với một ít dòng code đơn giản, bạn đã nhanh chóng có một API gửi email nhanh chóng, thuận tiện có thể sử dụng ở bất cứ đâu. Tuy nhiên, Google cũng có giới hạn về số lượt email có thể gửi đối với từng loại tài khoản.

Tham khảo: https://developers.google.com/apps-script/guides/services/quotas

Bài viết lần tới sẽ thử liên kết với Slack, điều này sẽ giúp mọi người lí giải dễ hơn sự linh hoạt của GAS, đặc biệt trong trường hợp hệ thống hiện tại không hỗ trợ setup SMTP như Slack channel.