通知してほしいけど Inbox に残ってほしくない Pull Request 通知メールなどを自動で整理する
今や有効活用している人はかなりすくなったように思えるメールボックス。ログインのための Identifier とそれに関する通知システムとしてのみ使っている人も多いかと思います。
が、私の場合日常的に Push 通知の集約を目的とし、例えば GitHub の Issue / Pull Request や、CI 落ちなどに対して素早く反応するための手段としてメールボックスを利用しています。
ただこの運用をしていると、「スマホの通知として受け取った瞬間」にだけ価値が存在しており、「PCで対象レポジトリを直接開いた瞬間」以降に価値のない情報が、時には未読状態でメールボックスに残り続けることになります。
これを定期に掃除する必要があり、二週間〜ひと月に一度まとめて行っているものの、忙しいときに一度できないと以降メールボックスを見に行くこと自体が気が重い作業になってしまう。という不都合が長らく存在していました。
今日は前日によく寝たということもあって、珍しくコンディションの良い日曜の朝を過ごせているので、せっかくなので整理を自動化することに。
Google Apps Script で自動化する
結論からいうと、以下のような Google Apps Script を記述することで解決しました。
実は イマドキの Google Apps Script は v8 に対応している ので、Clasp で環境を構築するなどの一手間を加えることなく、いわゆるモダン JavaScript での記述が可能となっています。
// ライセンスは MIT にしておくので Gist の方をすきに使ってください
// https://gist.github.com/potato4d/a08ade97d65ff882e5751fb85c7b6a6a
// 既読にしたいドメインを設定
const target = [
'notifications@github.com',
'builds@circleci.com'
]
function cleanupThreads() {
if (!target.length) {
return
}
console.log('Search threads..')
const threads = GmailApp.search(`label: unread AND (from: ${target.join(' OR from: ')})`)
console.log('Threads count :' + threads.length)
threads.forEach((thread) => {
thread.markRead()
// If you want to add to the trash
// thread.moveToTrash()
})
}
実際の処理として、以下の 3 つを行っているだけのシンプルなものです。
- target の配列にするアドレスをもとに
label:unread AND (from: notifications@gmail.com OR from: builds@circleci.com)
のようなクエリを作成 - クエリを実行してスレッドを取得
- 取得したスレッドに対して既読を付与、必要ならゴミ箱への追加も付与
という感じです。
コピペで使う場合にいきなり破壊的操作をしたくない人もいると思うので、コピペ用では一旦 moveToTrash をコメントアウトしてあります。お好みに応じてどうぞ。
自動化の設定方法
https://script.google.com/ で該当の Apps Script を配置したあとに、時計のマークみたいなのをクリックすると設定用のページに飛ぶので、こんな感じで設定してやると OK です。
私はひとまず 12 時間おきにしてあります。
おわりに
GAS を利用するとそれぞれの Google サービスとの API 連携の部分を考慮する必要がなくなったり、 SA を自分で管理しなくて良くなったりと、何かと都合が良いことが多いので、気軽に構築できるのは助かりますね。
もちろんしっかりとメンテナンスしていくものはレポジトリ作って管理していく形が理想ですが、GAS みたいなそもそも CI での動作検証が極端にしづらいものや、認証認可の基盤が実行環境に依存しているものは「やってもな〜」みたいな気持ちになりがちなので、個人利用なら Gist で管理できるくらいがちょうど良いかもなーと思ったり。
余談ですが notifications@gmail.com は本当に通知用であり、 receipt などは別のアドレスからとなるため、領収書保管したい勢も安心して実行してもらって大丈夫です。