送信時刻を指定して Gmail を送信する

(2019-05-10 追記:Gmail に公式に予約送信の機能が実装された。今後はこのコードではなくそちらの機能を使うことを推奨します。)

手紙は夜に書くな、とはよく言うけれど、しかしメールなんて夜ぐらいにしか書く気にならないというのもまた事実であり、深夜に書き上がったメールをさて送ろうと思ったときに、相手が携帯のアドレスだと睡眠を妨害しやしないかと少々躊躇してしまう。またたとえ携帯でなかったとしても、深夜にメールを送ったら「このひと、返信を書くのに悩みに悩みぬいたのだわ」と思われてしまいそうだ。もっとスマートに、朝起きて朝飯前にさらさらっと書いたふうを装いたい。

決まった時間に送信する、なんて機能は Gmail に標準搭載されていてしかるべきだと思わなくもないが、おそらくコストに見合わないのだろう。外部サービスとして Boomerang とか Right Inbox とかのサービスがあるけど、セキュリティ的にどうなのって思うし、金は払いたくない。また、以前に似たような記事を書いた が、あのコードは下書きの本文をコピーして新しいメールとして送信する(リプライチェーンが切れる!)というものだったのに加え、Google Sheets での操作が必要だったため実用的ではなかった。

Gmail の API に Drafts を直接操作できる API があるので、これを Google Apps Script と併用して、自前のサーバーなしに朝夕の自動メール送信を実現しよう。

使い方は以下である。

  • Google Apps Script で新しい Script を作成し(もしくは Google Drive から新しい Google Sheets を作成して、そこの Tools > Script Editor から新しい Script を作成)、下のコードを貼りつける。
  • Resources > Advanced Google Services から Gmail API を有効にして(スイッチを on にして)、下に表示される Google Developers Console へのリンクから Gmail API を有効にする。
  • sendMorningDrafts などの関数を Resources > Current project's triggers から適当な時間に登録。
  • あとは Gmailschedule/send-next-0700-0800 などの名前のラベルを作成し、それを Drafts にある下書きにつければ時間がくれば送信してくれる。
    • 最初の実行時には authentication があるのでテストもかねて手動で実行してみるのが吉。

利点としては、下書きにラベルをつけるという操作さえできれば Web からでも iOS App からでも送信予約ができる点が挙げられる。逆に悪い点としては、このメールはいついつに自動送信したい、みたいな細かい指定はできない点が挙げられる。

参考にした資料は以下である。

Automatically sends Gmail drafts with specific lab ...

(2016-07-21 追記:コードを Gist へ移行した。ついでに、API を直接叩いていたのを、Advanced Google Services のインターフェースを使うように変更。)

(2018-05-02 追記:Gist のコードを、G Suite Services 内の Gmail Service のみを用いるよう(Advanced Google Services のインターフェースを使用しないよう)に変更。)