先日、GmailからLINEに通知を飛ばす設定を少し見直そうとして、 「そういえば、どういう仕組みで作ったんだっけ?」と一瞬手が止まりました。
動いてはいるけど、作った本人が仕組みを忘れかけている。 これは将来の自分が困るやつだなと思ったので、自分用の整理メモとして、仕組みを記事にしておくことにしました。
結果的に「こんなことも出来るんだ」とか 「なるほど、こういう組み合わせなら実現できるのか」と 感じてもらえる内容にもなったと思うので、同じようなことを考えている方の参考にもなれば幸いです。
何を作ったのか
今回作ったのは、Gmailに届くメールのうち、次の条件に当てはまるものだけをLINEに通知する仕組みです。
- 件名に特定のキーワードが含まれているメール
- 差出人のメールアドレスが、あらかじめ登録したリストに含まれているメール
どちらかに一致すれば通知されます。 「件名 × 差出人」のAND条件ではなく、OR条件です。
通知されたメールは自動で既読になり、同じメールが何度もLINEに届くことはありません。
全体の仕組み(ざっくり)
使っているのは、次の3つです。
- Gmail(監視対象)
- Google Apps Script(GAS)
- LINE Messaging API
処理の流れを簡単に書くと、こうなります。
- GASが定期的にGmailの未読メールをチェック
- メールごとに「件名」と「差出人」を確認
- 条件に一致したものだけLINEへ通知
- 通知したメールだけ既読にする
GASの時間主導トリガーを使っているので、 一度設定すれば自動で動き続けます。
LINE側でやったこと
LINE公式アカウントを作成
Messaging APIを使うには、LINE公式アカウントが必要です。 以前は直接チャネルを作れましたが、現在は公式アカウント経由になっています。
必要な情報
GASからLINEへ通知を送るために、次の情報を取得しました。
- チャネルアクセストークン(長期)
- 送信先となる自分のユーザーID(Uから始まるID)
このユーザーIDはLINEアプリ上には表示されません。 LINE Developersコンソールの「あなたのユーザーID」という項目に表示されています。
また、通知を受け取るには、その公式アカウントを友だち追加しておく必要があります。
GAS側で気をつけたポイント
「未読のみ」を正しく扱う
GmailApp.search() で is:unread を指定しても、 実際には「未読を含むスレッド」が返ってきます。
そのため、スレッド内のメッセージごとに
- 本当に未読かどうかをチェック
- 通知したものだけ既読にする
という処理を入れています。
これをやらないと、既読メールまでまとめて通知されたり、 何度も同じ通知が来たりします。
Safariでトリガーが作れないことがある
Apps Scriptのトリガー設定は、Safariだと承認画面で詰まることがありました。 その場合はChromeでやると、すんなり通ることが多いです。
差出人メールアドレスを追加する方法
差出人による通知は、配列で管理しています。
新しく通知したいメールアドレスが増えた場合は、 その配列に1行追加するだけです。
コードを触るのはここだけなので、あとから見直すのも楽です。
件名キーワードを追加する方法
件名の条件も同じく配列で管理しています。
完全一致ではなく「含まれていたらOK」という判定にしているので、 表記揺れにも強めです。
添付ファイルについて
この仕組みでは、LINEに送っているのはテキストのみです。
メールに添付ファイルが付いていても、
- 添付ファイル自体は送信されません
- 通知は通常どおり届きます
個人的には「添付は見なくていいから気づきたい」用途なので、 この挙動でちょうど良いと感じています。
ハマりやすいポイントまとめ
- トークンやユーザーIDは絶対に公開しない
- 通知対象は「未読のみ」にする
- 通知したメールだけ既読にする
- 差出人を増やしすぎるとLINEが騒がしくなる
おわりに
この記事は、「これを読めば同じものが作れます」という体裁では書いていません。
というのも、このご時世いちばん簡単なのはAIに聞きながら、自分の環境や目的に合わせて作ることだと思っているからです。
実際、この仕組みも手順を調べて作ったのではなく 「こういうこと出来ないかな?」と思ったところから、 AIに相談しながら少しずつ形にしていきました。
こうやって、自分の生活にフィットする仕組みを思いついたタイミングで形にできるのは、 しみじみと良い時代ですね。