【GAS】Gmailからメールを検索する

Gmailからメールを検索する方法はググるとたくさんヒットするけど、どれも微妙だから自作した。

諸悪の根源はThread

メールの検索にはGmailApp.search()てメソッドを呼ぶけど、こいつがよくわからん。
なぜか戻り値がスレッドのリスト。。
メールのリストを返してくれれば良いのに。。

完成品

POINT 1: スレッドを全部展開する

2次元のfor文で中身を掘る。

POINT 2: 同一IDの除去

スレッドの仕様がよくわからないけど、展開しただけだと同じメールが複数件ある可能性がある。 なので同一IDを除去する。

POINT 3: ソート

検索結果はどうゆう順に取れるのかよくわからないので、日付でソートする。

とりあえずこれで完成。 ただし、メールが取得できたからと言って安心できない。

つらみ

メールの日付とは何か

getDate()で日付が取れるけど、これもよくわからない。
仕様書には

The date and time of this message.

と書いてあるけど、ざっくりしすぎ。。 受信したシステム日付であることを祈る。

ちなみに日付が送信者の言い値だと辛い。
メールサーバが滞留して1日遅れで届いた場合に、昨日の日付のメールが急に届く。例えば「1時間毎に試着メールをチェックする」みたいな処理を仕掛けると、昨日の日付のメールが急に届いてもメールのチェック対象から外れてロストする。。

本文が取れない

本文はgetPlainBody()で取れるが、本文サイズが大きすぎると取得できない。(仕様にないけど...) なので例えばシステムから飛んでくるメールに対して

「エラー」って文字列があったらslackに通知する

みたいな処理を書いていて本文サイズが大きくて取得できなかった場合、これも処理されずにロストする。

まとめ

GASは手軽で便利だけど、危険がいっぱいだから慎重に使おう。