メールで送られてきたお問い合わせをSlackに通知する

Customers Mail Cloudでは、メール送信だけでなく、メールを受信する機能があります。受信したメールは、転送する他、Webhookで外部システムへの通知も可能です。

今回はこの機能を使って、サーバレスにメールでのお問い合わせをSlackに通知する機能を作ってみます。

仕組み

仕組みは次のようになります。まずユーザはメールを送信します。そのメールはCustomers Mail Cloudで受信します。そして設定されているURL宛(Google Apps Script)にWebhookを送信します。そしてGoogle Apps ScriptからSlackへ通知します。ここまでの流れはサーバレスに実装できます。

f:id:moongift:20200228111031p:plain
システム構成

フォーマットはJSONとマルチパートフォームデータ

Customers Mail CloudでのWebhookの形式として、JSONとマルチパートフォームデータ(multipart/form-data)が選択できます。この二つの違いは、添付ファイルがあるかどうかです。今回は扱いやすさを重視し、JSON形式を選択しています。添付ファイルも想定される場合はJSON形式にしないでください。

f:id:moongift:20200228111057p:plain
Webhookの設定

Slackの準備

Slackではまずアプリを作成します。作成したアプリのOAuth&Permissionsで、 incoming-webhook を有効にします。これで外部から投稿可能になります。

f:id:moongift:20200228111120p:plain
Slackアプリの作成

そしてインストールして、トークン文字列を得ます。

Google Apps Scriptの実装

WebhookはPOSTメソッドで送信されてきますので、Google Apps ScriptではdoPost関数を用意します。まずWebhookから送られてくる情報を基にメッセージを組み立てます。そしてsendToSlack関数でメッセージを投稿します。

function doPost(e) {
  // Customers Mail Cloudから送られてくる情報
  const params = JSON.parse(e.postData.getDataAsString());
  // メッセージを組み立てる
  const message = `メールが届きました: ${params.subject}\nFrom: ${params.headers.filter(o => o.name == 'From')[0].value}\n\n${params.text}\n`;
  
  // Slackに投稿
  const res = sendToSlack(message);
  
  // Webhookに対するレスポンス
  const output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(JSON.stringify({ message: "success!" }));
  return output;
}

// Slackへの投稿処理
function sendToSlack(message){
  // Slackに送信するのに必要な情報
  const token = 'xoxb-...OpKj';
  const postUrl = 'https://slack.com/api/chat.postMessage';
  const postChannel = '#general';
  const username = 'CustomersMailCloud';
  const jsonData =
  {
     "channel" : postChannel,
     "username" : username,
     "icon_emoji": ":email:",
     "text" : message
  };
  const payload = JSON.stringify(jsonData);
  const options = {
    "method" : "GET",
    "contentType" : "application/json; charset=UTF-8",
    "headers": {
      "Authorization" : "Bearer " + token
    },
    "payload" : payload
  };
  return UrlFetchApp.fetch(postUrl, options);
}

作成したらWebアプリケーションとして公開します。後は実際にメールを送ってみてテストしてみましょう。

f:id:moongift:20200228111216p:plain
投稿テスト

まとめ

お問い合わせフォームを用意して、そこからSlackへ通知する仕組みはよくありますが、サーバ側の実装が必要になります。今回の方法であればメールアプリケーションだけなのでサーバを立てる必要がありません。サーバレスで実装できます。

大量のメール配信だけでなく、メール受信を通じたインテグレーションを構築する場合にもCustomers Mail Cloudを役立ててください!

受信サーバ | Customers Mail Cloud