Gmailの特定条件のメール受信をGASでDiscordに投稿して通知する

やりたいこと

Gmailに届いたメールのうち、特定の条件に従ったメールのみ
適当なDiscordのテキストチャンネルに通知する

やったこと

  1. Gmailのフィルタ機能で特定の条件のメールにラベルを自動付与する
  2. Discordにメール通知用のチャンネルを用意して、ウェブフックを有効にする
  3. GAS(Google apps script)でGmailの特定のラベルのメールを定期的にチェックさせる
  4. 新しいメールがあれば、Discordへの通知処理をしたうえで通知済みのラベルを付与する

必要なモノ

  • Googleのアカウント
  • Discordのアカウント
  • 少しばかりのJavaScriptへの理解

参考ページ

特定のメールを受信したことをLINEに通知する方法(Gmail+GAS+LINE)

GmailAppsのクラス仕様書:https://developers.google.com/apps-script/reference/gmail/gmail-app?hl=ja

具体的な手順

1.Gmailのフィルタ機能で特定の条件のメールにラベルを自動付与する

Gmailの上のほうにある検索バーの右端のスライダーっぽいアイコンを開きます。

適当な検索条件を設定します。
検索条件を設定したら「フィルタを作成」をクリックします。

件名だけだと偽装した迷惑メールも引っかかるので、Fromも条件に入れてあげるとよいと思います。

条件がうまく行ってるかを確認したい場合はそのまま「検索」ボタンを押してください。

フィルタを作成をおすと処理内容の設定画面に移るので
ラベルを付ける にチェックを入れて 「通知対象」のラベルを付けるようにしてください。

おわったら「フィルタを作成」で作業完了。

ついでに左のメニューの下のほうのラベルから「通知済み」のラベルも追加しておいてください。
通知し終わったメールにスクリプトが付与するラベルです。

2.Discordにメール通知用のチャンネルを用意して、ウェブフックを有効にする

既存のチャンネルを使うならそれでも問題ないです。

メール通知をさせたいテキストチャンネルを用意します。

チャンネルの右端の歯車アイコンからチャンネル設定を開き、
連携サービスの設定を開きます。

ウェブフックと言うのがあるので「ウェブフックを作成」をクリックして
ウェブフックを作成します。

ウェブフックと言うのは簡単に言うと
外部からそのチャンネルに投稿できるURLのような機能です。

作成するとこんな感じにウェブフック一覧に作成したものが出てきます。
初期設定だと味気ないので、名前とアイコンは変えておくと良さそうです。

ここで出ている「ウェブフックURLをコピー」でクリップボードにコピーされるURLは
あとでスクリプト内で使うので、メモしておいてください。
(あとでもう一度ここからコピーしなおしても良いけど)

3.GAS(Google apps script)のスクリプトを用意する

https://script.google.com/

Gmailと同じGoogleアカウントでGASにアクセスします。
GASはGoogleのアプリを連携させて自動化などが行えるGoogleのサービスです。

左上にある「新しいプロジェクト」で適当なプロジェクトを新規作成します。

すると、コード.gsというファイルの編集画面に遷移します。

プロジェクト名を変えたければ、適当に変えてもらって大丈夫です。

このコード部分に以下のコードをコピペします。

// WebhookのURL
const webhookURL = 'https://discord.com/api/webhooks/......'; 

// 動作対象のラベル名
const after_label = '通知済み';
const target_label = '通知対象';

function send_discord(Me) {
  // Discordに表示する文章.
  let messageBody = '';
  messageBody += `----------\n`;
  messageBody += `メール通知自動システム\n`;
  messageBody += `----------\n`;
  
  // メールの件名と本文
  messageBody += Me
  
  //デバッグ用
  console.log(messageBody)
  const message = {
    'content': messageBody, 
    'tts': false,
  }

  var param = {
    'method': 'POST',
    'headers': { 'Content-type': 'application/json' },
    'payload': JSON.stringify(message)
  }
  // webhookにPOST
  UrlFetchApp.fetch(webhookURL, param);
}

function fetchContactMail() {

    var ISREAD_LABEL = GmailApp.getUserLabelByName(after_label);
    var term = 'label:' +target_label + ' -label:' + after_label
    var strTerms = (term);
    // ラベル条件に沿ったメールを抽出する
    var myThreads = GmailApp.search(strTerms);
    var myMsgs = GmailApp.getMessagesForThreads(myThreads);
    console.log('メッセージ数:' + myMsgs.length);
    // 各メッセージをdiscordに投下する
    for (var i = 0; i < myMsgs.length; i++) {
        var valMsgs = "\n\n件名:" + myMsgs[i][0].getSubject()
            + "\n" + myMsgs[i][0].getPlainBody();
      if(valMsgs.length>2000){
        valMsgs = valMsgs.substring(0,1950)
      }
      send_discord(valMsgs)
    }

    // 処理完了後にすべて通知済みのラベルを付与する
    myThreads.forEach(function (t) {
        t.addLabel(ISREAD_LABEL);
    });

    return valMsgs;
}

function main() {
    new_Me = fetchContactMail()
}

コード最上部のウェブフックのURLは、先ほど作ったウェブフックのURLに書き換えてください。
通知ラベルは適当に変えても動くと思います。

動作確認をする

  1. 適当なメールに「通知対象」のラベルを付与する
  2. エディタ上部の「実行」の脇にあるプルダウンで「main」を選択する
  3. エディタ上部の「実行」を押す

この状態で「実行」を押すとスクリプトが実行されます。
そうすると、実行対象のラベルのメールを取得して
Discordのチャンネルにテキスト投下、通知済みのラベルを付与します。

一応ログを出すようにしているので
実行ボタンを押した際に出てくる実行ログに、いくつか情報が出力されるはずです。

Discord側はこんな感じで届きます。

4.スクリプトを定期的に実行するように設定する

GASのプロジェクトの一番左のメニューに時計のアイコンで「トリガー」と言うのがあるのでそこを開きます。
右下の「トリガーを追加」より新規トリガーを以下のような設定で作成します。

編集個所は
* 実行する関数を選択:main
* 時間ベースのトリガーのタイプを選択:分ベースのタイマー
* 時間の感覚を選択:1分おき

特にすぐに通知がいらない場合は
1日単位での実行とかでも大丈夫です。

あとは「保存」を押すと
設定したタイミングで、先ほど作ったスクリプトが実行されます。

特に対象のラベルにメールが無ければDiscordへの通知も発生しないので
このまま放置で、必要なタイミングでメールが来るはずです。


GASとDiscordのウェブフックを組み合わせると
色んなGoogleサービスの通知をDiscordに集約できそうです。

個人で使う分には普通にGmailの設定をきちんとすればいい気もしますが
組織や団体のメールをGmailにしている場合に、グループのDiscordに通知したりと何かと便利に使えそうな予感がします。

とりあえず今から、バンドの通販の購入通知を実装してきます。ノシ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA