以下では、GmailAppを用いたメールのDB登録や添付ファイル処理を実装する際の懸念点や工夫について、まとめて解説します。特に無料(個人)アカウントにおける1日あたり2万回の呼び出し制限をどのように回避しつつ、効率的に動作させるかを中心に取り上げます。
1. GmailAppの上限と無料アカウントの背景
多くの検証例で示されているように、無料アカウント(個人の Google アカウント)では、GmailAppの呼び出し回数が1日あたり約2万回で制限に達するといわれています。
「Service invoked too many times for one day: gmail.」というエラーが起きた場合は、1日の許容範囲を超えていることを意味します。さらに、上限リセットは太平洋標準時(PST)の午前0時に行われ、日本時間(JST)では17時前後が区切りとなります。
2. メールのDB登録の処理フロー概要
- 実装例
GmailApp.search()
でスレッドを取得するGmailApp.getMessagesForThreads()
などでメール本体の情報をまとめて取り出す- 取得したメールをDBに挿入(
INSERT IGNORE
などを活用して重複登録を防止)
- 呼び出し回数の目安
1回の実行あたり、検索やメッセージ取得でおおむね5~6回ほどGmailApp
を呼び出す設計にしているケースが多いです。
もし10分間隔で1日144回トリガー実行するなら、144回 × 6回 = 864回 と見積もれます。毎回最大限スレッドを検索したとしても、無料アカウントの2万回/日という上限に対して十分余裕があります。 - バッチサイズの考え方
1度に100件のスレッドを取得しようとしても、検索クエリで条件が合わなければ数件しか処理されないこともあります。逆にメールが多い状況でも、コード内で「ループ中の取得上限(MAX_TOTAL_THREADS
など)」を定義しておけば、一度の実行での呼び出しは増えすぎません。
3. 添付ファイルの取得とS3へのアップロード
- 処理概要
- DBに登録済みのメールIDを取得(添付ファイル未処理のものを抽出)
- 各メールIDごとに
GmailApp.getMessageById()
でメッセージを呼び出す message.getAttachments()
で添付ファイルを取り出し、外部ストレージ(S3など)へアップロード- DBにアップロード結果(S3のURLやファイル名)を追記
- 呼び出し回数の想定
1つのメールにつきgetMessageById()
とgetAttachments()
を各1回ずつ呼び出す設計にするため、1通あたり2回が目安になります。
もし1度の実行で最大30件のメールを処理するなら、30×2=60回の呼び出し。これを10分間隔で1日144回実行すると、60×144=8,640回となります。
4. 両処理を合わせた呼び出し合計
もし「DB登録処理」と「添付ファイル処理」をそれぞれ別のスクリプトで動かし、各々10分おきに実行した場合、前者で864回/日・後者で8,640回/日となり合計 9,504回/日の理論値が得られます。
この範囲内であれば無料アカウントの2万回/日の上限に達しにくく、実運用で多少メールが増えても余裕を持って動作可能です。ただし、以下のような変化があると上限超過のリスクが高まります。
- トリガー頻度を短く(5分間隔など)して実行回数が増える
limit
やbatchSize
を変更して、1回の処理対象を大幅に拡張する- 別のスクリプトでも同アカウントで大量にGmailAppを使用している
- エラー時のリトライやトリガーの多重実行により、想定外に呼び出し回数がかさむ
5. 上限に近づかないための対策
- 実行間隔や上限値を調整
10分間隔でのトリガーでも十分な場合は、あえて5分や2分などに詰めず、現状のまま運用すると安定します。 - バッチサイズをコントロール
MAX_TOTAL_THREADS
やlimit
を必要最小限に設定すれば、想定外の集中呼び出しを防ぎやすくなります。 - 高度なサービス・有料アカウントの検討
メール数が膨大な場合や、どうしても呼び出し数が増える場合には、有料の Google Workspace や Advanced Gmail Service(Gmail API)を利用する方法もあります。認証設定や実装の追加が必要ですが、呼び出し上限がより高い水準に設定されている可能性があります。
6. まとめ
- 無料アカウントでも1日2万回前後の呼び出しが目安
- バッチサイズと実行頻度を組み合わせ、定期的な処理が重ならないように工夫
- 毎回最大件数を処理する状況に陥らなければ、合計1万回程度の呼び出し数で収まるケースが多い
以上のポイントを踏まえると、無料アカウントにおけるGmailApp利用は適切にスクリプトを組めば、大量のメールでも比較的安定して動かせます。ただし、条件次第ではエラーが起きる可能性もあるため、リトライ設計やログ確認を組み合わせて運用するのが望ましいでしょう。
引用・参考情報
- [Google Apps Script: Quotas for services](https://developers.google.com/apps-script/guides/services/quotas “Google公式ドキュメント” target=”_blank” rel=”nofollow”)