2019年3月1日金曜日

Gmail に予約送信機能を実装するには・・・

Gmail自体に予約送信機能(2019年3月1日時点)はありません。
*2019年4月1日に、予約送信機能の実装を計画しているよーという内容がアニメーション付きで、Hitting send on the next 15 years of Gmail(Google)に掲載されています。そのため、いずれ実装されるかなぁと思います。

いずれにしても、現時点(2019年3月1日)ではないため、欲しいのなら他の方法を考えなければなりません。筆者が所属する京都大学でも2月中旬にめでたくG Suite for Education のサービスが開始したこともあり、Google Apps Scriptでいろいろ出来ないかなぁと模索しているところでした。
そこで調べてみると、機能として実装するには下記のような方法があります。

1. サードパーティのアドオンをつかう


  1. [G Suite専用] G Suite MarketPlace で提供されている予約送信機能を追加する
  2. ブラウザのアドオンをつかう(Right Inbox, Boomerang 等)
  3. 電子メールソフトのアドオンをつかう(Thunderbird + 後で送信(アドオン))

2. Google Apps Script をつかう(自作する)


スクリプト開発サイト
アドオンがGmailにアクセスするのが許せない、心配だ!という場合もあると思います。たしかに
 Right Inbox のプライバシーポリシーには、
  • Right Inbox does not store the content of your emails.
の記述があり、ポリシー的には問題ないことになります。そうはいっても、それを信頼できるかは別の話です。となってくると自作するしかありません。

で下書きを利用したスクリプトを公開されている方がいたので、そのコードを少しいじって、使い方のマニュアルを作成してみました!



*Googleスライドの機能を使って、PowerPointやPDFに保存し直すことができます。資料については自由に使ってください。ただし免責事項(末尾記載)にあるように、現時点では動作チェックしましたが、未来に動かなくなっても責任は取りませんのであしからずー。

以下、上記スライドを書くまでの経緯です。


まずパッと思いついた方法は2つぐらいです。

1. Googleフォームで入力 ==> Googleスプレットシートに保存 ==> Googleスプレットシートを定期的にチェックして指定の日時になったらGoogleスプレットシートのデータを元にGmailを送信(Googleスプレットシート内のスクリプトエディタ:Google Apps Script + 時間トリガー)

2. Gmailに下書き保存。どこかに送信日時を入れておく ==> 下書きにある送信日時を過ぎたら送信(GoogleドライブのGoogle Apps Script + 時間トリガー)


です。後者が素直そうです。これについて作ってみようかなぁと思っていたらすでに作って公開している人がいました!!

Gmailで指定日時に送る ってのをGoogle Apps Scriptで書いた(きじとら)


そうそう、こんなことを実装したかったのだ!と思いました。
実際スクリプトを試してみると、
で筆者が出したスライドのように、「このアプリは確認されていません」という警告がでるので、「安全だよ!」という設定(詳細  > ○○(安全ではないページ)に移動)をしてあげる必要があります。
なお新規スクリプト作成については、G Suite Developer Hub 経由で作るのが見やすいですね! 下図のように実行できているかチェックすることもできます。


トリガーの時間制限に注意!!


Quotas for Google Services によれば、
  • Email read/write (excluding send)
    • 無料版   20,000 クエリ /日
    • G Suite 40,000 - 50,000 クエリ / 日(Editionによる)
  • Triggers total runtime
    • 無料版   90分 / 日
    • G Suite 3 - 6時間 / 日
だそうです。下書きのメールを read するわけですから、この制限にひっかかるのかなと思います。となると 1分ごとにチェックし、該当メール件数が 1通のみだとすると、60クエリ / 時、1,440クエリ /日 となり余裕です。しかしヒットする件数が多くなるとすぐに超えちゃいそうです。ただ、GmailApp.getDraftMessagesでの取得が 1クエリなのかヒットする件数なのかがいまいちわからない(探しきれない)ので、一度 1分ごとに実行してどうなるかチェックしてみないとだめかも知れません。

また、トリガーの実行時間も関係するかもしれません。無料版だと 90分。かりにスクリプト実行時間が 1回1秒、1分単位で実行すると 1,440秒 / 日(24分 / 日)なので、無料版だと微妙かもしれません。スクリプトの実行時間が 4秒(つまり 96分 / 日)かかると制限にひっかかりますね。


をみると 5-7秒 / 回 かかっているので、かりに 10秒 / 回 ぐらいかかると想定した場合、14,400 秒 / 日(240分 / 日 = 4時間 / 日)となり、G Suite でもギリギリということになります。1時間に1度なら、240秒 / 日 (6分 / 日)となり、余裕が生まれますね!

実際のトリガー間隔は、数時間あるいは日時ベース


予約投稿ですから、たとえば翌日以降の予約でよいというルールを設けておいて、翌日の早朝(6時とか7時)の1日に一度のみ実行することにして、予約は日のみ(時間は 0:00 と固定する)という手もあります。

あるは1時間おきにチェックして、予定している時間より最大1時間遅れるぐらいな気持ちで運用する( 10:00 に設定したら、遅くても11時ぐらいには送信される、つまりその日銃に送信されるよ)という感じにすれば十分です。


このように時刻まで厳密にしなければいくらでも運用の方法はありえます。


下書き&スターがあれば実行するにカスタマイズ!


送信予約日時を件名にセットして下書きにいれただけだとうっかり書きかけで送信してしまうかも知れません。Gmailは一文字でも変更したら下書きに自動保存するためです。そこで、さらに「スター」がついている場合のみ実行するよう変更すればどうかと思いました。

つまり
  1. {年/月/日 時:分} 件名 を入れて下書きに保存
  2. その下書きにいれたメールに「スター」をつける
この2つの条件が一致したときのみ、実行すればよいという仕組みです。こうすれば下書きにいれただけでは送信されません。

というわけで 2についてカスタマイズしたのでした。
そのコードは



に公開しました。

2019年3月1日 @kimipooh

0 件のコメント:

コメントを投稿