Google Apps Script を使って Gmail メールを Slack に転送する方法
Gmail フィルター + Google Apps Script を使ってメール受信時にカスタマイズした内容を自動で Slack チャンネルに転送する

Photo by Lukas Blazek
起源
最近、iOSアプリのCI/CDプロセスを最適化しており、Fastlaneを自動化ツールとして使用しています。パッケージをアップロードした後、自動審査申請を続ける場合(skip_submission=false)、Appleの処理完了まで約30〜40分のCIサーバー時間が必要です。これはAppleのApp Store Connect APIが十分に整備されておらず、Fastlaneもアップロードしたビルドの処理完了を1分ごとにしか確認できないため、非常にリソースを浪費しています。

-
Bitrise CI サーバー: 同時ビルド数と最大実行時間を90分に制限。90分は十分ですが、1つのビルドが詰まると他の人の実行を妨げます。
-
Travis CI サーバー: ビルド時間に応じて課金されるため、待つ余裕はありません。無駄なコストが発生します。
別のアプローチ
もう待たない、アップロード完了後すぐに終了!処理済みのメール通知で次のアクションをトリガー。

ただ最近このメールが届かなくなりました。設定の問題か、Appleがこの種の通知を送らなくなったのか分かりません。
本文は Testflight のテスト開始通知メールを例に説明します。


全体の流れは上図の通りで、原理的には可能ですが、本記事の主題ではありません。この記事では、メール受信後に Apps Script を使って Slack チャンネルに転送する部分に焦点を当てます。
受信したメールを Slack チャンネルに転送する方法
有料・無料のSlackプロジェクト問わず、さまざまな方法でEmailをSlackのチャンネルやDMに転送することが可能です。
公式ドキュメントを参照して設定してください: 傳送電子郵件至 Slack
どの方法でも効果は以下の通りです:

デフォルトでメール内容は折りたたまれており、クリックすると全文が表示されます。
利点:
-
簡単で迅速
-
技術的なハードルなし
-
リアルタイム転送
欠点:
-
内容をカスタマイズできません
-
表示スタイルは変更できません
カスタム転送内容
この記事で紹介するポイントです。

メールの内容データを自分が表示したいスタイルに変換します。上の画像の例のように。
まずは全体のフロー図を示します:

-
Gmail フィルターを使って転送するメールに識別ラベルを付ける
-
Apps Script が指定ラベルの付いたメールを定期取得する
-
メール内容の読み取り
-
希望する表示スタイル
-
Slack Bot API または Incoming Webhook を使って Slack にメッセージを送信する
-
メールのラベルを削除(転送済みを示す)
-
完了
まず、Gmailでフィルターを作成します
フィルターは、条件に合ったメールを受信した際に自動で以下のような処理を行うことができます:自動で既読にする、自動でタグを付ける、自動で迷惑メールに移動する、自動でカテゴリに振り分ける…などの操作

Gmail の右上にある詳細検索アイコンボタンをクリックし、転送したいメールの条件を入力します。例えば、送信元:[email protected] + 件名が is now available to test.。次に「Search」をクリックして、フィルタ結果が期待通りか確認します。正しければ、Search の隣にある「Create filter」ボタンをクリックします。

または、メールの上部にある「Filter messages like these」をクリックすると、フィルタ条件を素早く作成できます。

このボタンのデザインは非常に使いにくく、初めて探したときに全く見つけられませんでした。

次に、このフィルタ条件に一致するメールに対して行う動作を設定します。ここでは「ラベルを付ける」を選択し、新しい識別用ラベル「forward-to-slack」を作成します。「フィルタを作成」をクリックして完了です。
以降、このラベルが付けられたメールはすべて Slack に転送されます。
Incoming WebHooks アプリの URL を取得する
まず、Incoming WebHooks アプリを Slack チャンネルに追加します。これを通じてメッセージを送信します。

-
Slack 左下の「Apps」->「Add apps」
-
右側の検索ボックスで「incoming」を検索してください。
-
「Incoming WebHooks」をクリックして、「Add」を選択してください。


メッセージを送信したいチャンネルを選択します。

最上部の「Webhook URL」をメモしてください

下にスクロールすると、メッセージ送信時に表示されるBotの名前とアイコンを設定できます。変更後は「Save Settings」を必ず押してください。
備考
公式では新しい Slack APP Bot API の chat.postMessage を使ってメッセージを送ることを推奨しています。簡単な Incoming Webhook は将来的に廃止される予定です。ここでは手抜きで使っていませんが、次章の「従業員リストのインポート」と組み合わせる場合は Slack App API を新しい方法に合わせて調整する必要があります。

Apps Script の作成
-
左上の「新しいプロジェクト」をクリックしてください
-
作成後、プロジェクト名をクリックして名前を変更できます。例:ForwardEmailsToSlack
以下の基本プログラムを貼り付けて、あなたが望むバージョンに変更してください:
function sendMessageToSlack(content) {
var payload = {
"text": "*あなたにメールが届きました*",
"attachments": [{
"pretext": "メール内容は以下の通りです:",
"text": content,
}
]
};
var res = UrlFetchApp.fetch('貼上你的Slack incoming Webhook URL',{
method : 'post',
contentType : 'application/json',
payload : JSON.stringify(payload)
})
}
function forwardEmailsToSlack() {
// 参考:https://gist.github.com/andrewmwilson/5cab8367dc63d87d9aa5
var label = GmailApp.getUserLabelByName('forward-to-slack');
var messages = [];
var threads = label.getThreads();
if (threads == null) {
return;
}
for (var i = 0; i < threads.length; i++) {
messages = messages.concat(threads[i].getMessages())
}
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
Logger.log(message);
var output = '*新着メール*';
output += '\n*送信者:* ' + message.getFrom();
output += '\n*宛先:* ' + message.getTo();
output += '\n*CC:* ' + message.getCc();
output += '\n*日付:* ' + message.getDate();
output += '\n*件名:* ' + message.getSubject();
output += '\n*本文:* ' + message.getPlainBody();
sendMessageToSlack(output);
}
label.removeFromThreads(threads);
}
上級:
-
Javascript の正規表現マッチ関数を使って、メールの内容をマッチングして取得できます。
EX:Testflight 審査成功メール内のバージョン番号情報を取得する例:
メール件名:あなたのアプリ XXX はベータテストの承認を受けました。
メール内容:

私たちは Bundle Version Short String と Build Number の後の値 を取得したいです。
var results = subject.match(/(Bundle Version Short String: ){1}(\S+){1}[\S\s]*(Build Number: ){1}(\S+){1}/);
if (results == null \\|\\| results.length != 5) {
// 無効です
} else {
var version = results[2];
var build = results[4];
}
-
オンラインで正規表現が正しいかどうかをテストするには、こちらのサイトを使用してください。
実行してみる
-
Gmail に戻り、適当なメールを選んで手動でラベル「forward-to-slack」を付けます。
-
Apps Script のコードエディタで「forwardEmailsToSlack」を選択し、「実行」ボタンをクリックしてください


「Authorization Required」が表示されたら、「Continue」をクリックして認証を完了してください。

認証の過程で「Google hasn’t verified this app」という表示が出ることがありますが、これは正常です。私たちが作成した App Script は Google の認証を受けていないためです。しかし、自分用に作成したものなので問題ありません。
左下の「Advanced」→「Go to ForwardEmailsToSlack (unsafe)」をクリックしてください。

「Allow」をクリックしてください

転送成功!!!
トリガー(スケジュール)設定による自動チェック&転送

Apps Script の左側メニューで「トリガー」を選択します。

左下の「+ 新しいトリガーを追加」。

-
エラー通知設定:スクリプト実行中にエラーが発生した場合の通知方法を設定できます
-
実行したい機能を選択してください:メイン機能である
sendMessageToSlackを選択してください -
アクティビティのソース選択:カレンダーまたは時間駆動(定期または指定)から選べます
-
時間型トリガー条件の選択:特定の日付に実行するか、分/時/日/週/月ごとに一回実行するか選べます
-
分/時/日/週/月の間隔を選択:例:毎分、15分ごと…
ここではデモとして1分ごとに実行する設定にしていますが、メールのリアルタイム性を考えると1時間ごとにチェックするだけで十分だと思います。

-
再び Gmail に戻り、適当なメールを選んで手動でラベル「forward-to-slack」を付けます。
-
スケジュールトリガーの待機
自動チェック&転送成功!
完了
この機能により、カスタマイズしたメール転送処理が可能になり、さらにトリガーとしても利用できます。例えば、XXXのメールを受信したときに自動で特定のスクリプトを実行するなどです。
第一章の起源に戻ると、この仕組みを使って CI/CD プロセスを改善できます。アップルの処理完了をただ待つ必要がなく、自動化プロセスと連携できます!
関連記事
Post MediumからZMediumToMarkdownを使って変換。



コメント