GMailの任意ルールに合致したメールだけをノティフィケーション（通知）したい

iPhoneで特定の条件に合致したメールを受信した際、簡単に通知を受け取りたいと思ったことはないでしょうか。GMail標準アプリをインストールすることでも通知は可能なのですが、重要メールしか通知されないし、重要なメールは全て通知されてしまうというデメリットがあります。重要なメールでも特定の条件に合致したメールについてだけ通知をしたいといった場合に不便だからです。
そうした場合にはIFTTTとGAS（GoogleAppsScript）を使った方法が一つの選択肢となります。2つの方法についてまとめておきます。

## 1. GMail標準アプリで実現する方法（重要メール通知を流用）

iPhoneのGMailアプリを使っている場合、「重要なメールについてだけ通知表示したい」という場合には「重要なメール」機能を使うことで一応実現することが出来ます。手順としては次のようなイメージとなります。

#### 1-1. Web上のGMailから設定を開く

| まずはGMailの設定から |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/c6cdf808-f7bf-d337-a84e-4c007df4f321.png)
 |

#### 1-2. スマホ上で通知を出したい条件で「フィルター」を作成

| 好きなフィルター条件を定義する |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/6aaccbef-c4fa-9136-ec11-e9a53e33abe1.png)
 |

#### 1-3. フィルターアクションには「常に重要マークを付ける」を指定する

| アクションには重要マークを指定する |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/b89288b8-1cae-fbd0-fa06-79222a644a5e.png)
 |

#### 1-4. GMailアプリの設定で、「高優先度のみ通知する」設定にする

| 「高優先度のみ通知する」はアカウント毎に指定可能 |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/8ad5b8fc-a3c6-1e90-3c62-d3c7cfc1e035.png) |

これによって、特定のアカウントで「高優先」と判断されたメールは通知されるようになります。
こちらの設定にはメリットと、デメリットがあります。

|   | メリット |
|:-:|:--|
| 1 | 標準機能で実現できる |
| 2 | 通知タップ時にメールスレッドが開く |

|   | デメリット |
|:-:|:--|
| 1 | GMailアプリのインストールが必要 |
| 2 | 重要なメールだけが通知対象 |
| 3 | 通知したくない重要メールも通知される |

:::note warn
GMailアプリのインストールが必要。
:::

:::note warn
重要なメールを細かく指定出来ない。
:::

## 2. IFTTTとGASで実現する方法

そこで、GMailアプリをインストールして標準メールアプリと二重管理になるのが嫌な人や、重要かどうかと通知したいかどうかは別々に管理／実現したいといった人にはIFTTTとGASで実現する方法が便利かもしれません。

#### 2-1. IFTTTアカウントを準備

IFTTTアカウントがあれば何でも構いません。対象としたいGMailアカウントで登録しておく必要も全くありません。勿論、通知の対象としたいGMailアカウントで登録して置いても構いませんし、その方がどちらかと言えば直感的で分かり易いかとは思います。

#### 2-2. ウェブフックを受けて、プッシュ通知を送信するアプレットを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/63b7e782-c9bd-ad19-f4c8-dbf0c38ee896.png)

| WebHook → プッシュ通知のアプレットを作成 |
|:-:|
|  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/82c9ed3b-2894-82f5-e79b-70ed5dba0132.png)
 |

プッシュ通知のメッセージは一応、タイトルと本文（の一部）を想定して2つの引数Value1, Value2を送信する想定にしておきます。

#### 2-3. 対象となるGMailアカウントと同一アカウント上でGASを用意する

```javascript:Google Apps Scriptコード
// YOUR_IFTTT_ACCOUNT_KEY を自分の設定に変更
var URL_NOTIFY = 'https://maker.ifttt.com/trigger/SendNotification/with/key/YOUR_IFTTT_ACCOUNT_KEY';
var LABEL_SHOULD_NOTIFY = 'shouldNotification';
var IS_DEBUG = true;

function action() {
  logStart(arguments);
  
  // ラベルのIDを取得
  var objLabel = GmailApp.getUserLabelByName(LABEL_SHOULD_NOTIFY);
  
  // 通知すべきラベルがついたメールスレッドを一括取得
  var threads = GmailApp.search(`label:${LABEL_SHOULD_NOTIFY} is:unread`);
  log(`${thread} mails ${thread.length}`);
  // 各スレッドについて処理
  for(var n in threads){        
    var thread = threads[n];        
    var messages = thread.getMessages();
    // 各メールについて通知を実施
    for(m in messages){
      var message = messages[m];
      log(`message ${message}`);
      
      var date = message.getDate();
      log(`date ${date}`);
      
      var body = message.getPlainBody().split('\n')[0];
      log(`body ${body}`);
      
      var id = message.getId();
      log(`id ${id}`);
      
      var subject = message.getSubject();
      log(`subject ${subject}`);

      sendNotification(encodeURI('[' + subject + ']'), encodeURI(body));
//      msg.markRead();
    }
    // スレッドからラベルを削除
    thread.removeLabel(objLabel);
  }
  
  logEnd(arguments);
}

// プッシュ通知を送信
function sendNotification(title, message) {
  logStart(arguments);
  
  if (title == null) title = 'testTitle';
  if (message == null) message = 'testMessage';
  UrlFetchApp.fetch(`${URL_NOTIFY}?value1=${title}&value2=${message}`);
  
  logEnd(arguments);
}

///// sub routine

function logStart(caleeArgs) {
  log(`${caleeArgs.callee.name} start`);
}

function logEnd(caleeArgs) {
  log(`${caleeArgs.callee.name} end`);
}

function log(message) {
  // if (typeof(message) != 'string') return;
  if (IS_DEBUG) Logger.log(message);
}
```

:::note warn
権限付与が必要となるので、action関数を一度 手動実行して権限を付与します。
:::


#### 2-4. Web上のGMailでフィルターを用意する

前段のGMail設定を参考にして自由に条件を指定してフィルターを作成します。フィルターアクションには「ラベルを付ける」を指定してラベルの名前は「shouldNotification」を指定します。
ラベル名を変更したい場合には前段のGASプログラム内の定数```LABEL_SHOULD_NOTIFY```の値も同じように変更します。

#### 2-5. GASのトリガーを作成する

| 10〜15分に一度程度実行されるようトリガー作成 |
|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/5e65cb3a-3913-dbd3-2b49-5e61679d63b3.png)
 |

#### 2-6. IFTTTアプリをスマホにインストールする

これによって、特定のアカウントで「特定の条件」に該当するメールについて通知されるようになります。
こちらの設定にも残念ながらメリットと、デメリットがあります。

|   | メリット |
|:-:|:--|
| 1 | メールアプリを複数入れなくて良い |
| 2 | 重要メールかどうか関係なく、好きな条件で通知を出せる |

|   | デメリット |
|:-:|:--|
| 1 | IFTTTアプリのインストールが必要 |
| 2 | 通知はリアルタイムではない |
| 3 | 通知をタップしてもメールスレッドは表示されない（IFTTTアプリが起動する） |

:::note warn
通知はリアルタイムではない。ただし、5分毎にGASが回るようにすれば期待値は2.5分程度にはなる。
:::

## 3. 応用編

通知をスマホに届けるだけではなくて、デスク上のLaMetric Time据え置き型の時計に表示させることも容易に出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/91bc78eb-c530-e8a2-4026-089f876e4ca2.png)

LaMetric Timeを使って朝会議があるときだけ開始前にアラームを鳴らす([https://qiita.com/minmin68/items/0013df2c9ec99b51fce5]()) を参考に、IFTTTの通知アクションの最後にLaMetric Timeへの通知表示Widgetを追加すればOKです。

## 4. 最後に

ネット検索すると「GMailアカウントでIFTTT登録した場合に、メール受信をIFTTTアプレットのトリガーに出来ない」という説明が書かれたサイトがGoogle検索の上の方に上がってきます。まず、GMail着信をアクションとしたアプレットは作れません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/8140c457-9c0d-d7c2-8616-bbb312a5026b.png)

次に、IFTTTの独自アカウントにメールを転送し、この着信のタイミングを持ってアプレットを動作させる案が思い浮かびますが、これを行うにはGMailからIFTTTにメールを自動転送設定しなくてはなりません。ここで、GMailから自動転送をかけるには最初に転送先に届いた認証用メール内のリンクをクリックする必要があるのですが、このメールが自分のアドレスではなくGMail運営アドレスから送られるためどうやってもそれを見る事が出来ないのです。

当該のサイトなどではたまに別の（勿論GMail以外の）メールアドレスを経由する方法などを回避策として挙げているのですが、そもそもGMailのメールを扱いたいわけですから、GASとIFTTTのウェブフックアクションを使って、より直感的にこのジレンマを回避し連携が出来る方法をご紹介しました。

以上