🗑️

GASでGmailの自動削除をしよう(複数条件対応)

2021/04/05に公開

この記事で出来ること

AWS S3のライフサイクルポリシーのように、Gmailの自動削除をGASで実装します。
書きやすかったので、またGASネタを擦ることになりました...
実装に関するアドバイスをいただけると嬉しいです。

intro

エンジニアのみならず、お勤めの企業によっては
メールを飛ばしまくる運用をしている場合があると思います。
メールの増えすぎで何が起こるかというと

  • 不要メールのフィルタリングが要る
  • GoogleDriveがメールでパンクする

という2点が大きく問題になってくるでしょう。
G Suiteのプランによっては、GoogleDriveが30GBしかないので
ファイル+Gmailで30GBと考えると、割とシビアな状況に発展しかねません。

そこで今回は、GoogleAppsScriptを用いて
『◯日経過したGmailは自動でゴミ箱に移動する』というシステムを実現しましょう。
しかも、複数のフィルタ条件を1つの関数で処理出来ます。

コード

コード.gs
//条件を複数セット可
const configmaps = [
  {'older_than':'365d','label':'mylabel'},
  {'older_than':'90d','subject':'sub2'}
]
//実行間隔(分)
const interval = 15


//時間取得
const NowTime = new Date();
const NowHour = NowTime.getUTCHours() + 9 //UTC -> JST
const NowMinutes = NowTime.getUTCMinutes()
// const NowDayOfWeek = NowTime.getDay()

//実行するマップの決定
const rotation = NowHour*(60/interval) + Math.floor(NowMinutes/interval) +1
const elem = rotation%configmaps.length

//メイン
function main (){
  execfilter = generateFilterFromMap(configmaps[elem])
  deleteMail(execfilter)
}

//Mapを検索条件の形に整形
function generateFilterFromMap(map){
  let filter = ''
  for( key in map ) {
    filter += key + ':' + map[key] + ' '
  }
  //スター付きを除外
  filter += '-is:starred'
  return filter
}

//メールを削除 (100件 x5)
function deleteMail(filter) {
  console.log('filter -> ' + filter)
  let count = 0
  let targetThreads = GmailApp.search(filter,0,100)
  while ( targetThreads.length != 0 && count < 5){
    GmailApp.moveThreadsToTrash(targetThreads)
    console.log('loop ' + (count + 1) + ' -> ' + targetThreads.length + 'threads were deleted')
    targetThreads = GmailApp.search(filter,0,100)
    count++
  }
}

コードの説明

上記コードが何をしているのかと言うと
・gmailの検索条件を設定
・1日(24時間)を分割して番号振り→順番に実行
・検索して引っ掛かったものを100件ずつ削除(最大500件)
といった具合です。

configmap の書き方

上記のコードだと
・『365日経過した"mylabel"というラベルのメール』を削除
・『90日経過した"sub2"という件名のメール』を削除
といった意味合いになります。

//実行間隔(分)
const interval = 15

これはトリガーの実行間隔を指します(後ほど解説)

使い方

  1. GoogleAppsScript にアクセス
  2. 新しいプロジェクトを作成

    新しいプロジェクト
  3. ↑のコードを貼り付け
  4. configmaps実行間隔に適切な値を入れる
  5. 実行トリガーを設定する。画像の場合は15分おきなので、コードの実行間隔も15にしておく

    トリガーで定期実行だ

    適切に設定しよう
  6. mainを実行して、動くか試してみる

実装に関して

・何故500件ずつなのか
GASの処理限界時間を超えないよう、余裕をもってこの件数になりました。
・わざわざMAPで条件を実装した理由
これに関していえば、より分かりやすいかなと思ったからです。
変数を使う場合でも+で結合するよりいいかなと思ったので。

outro

1トリガーで複数条件をどう回すか頭を悩ませました
結果
(24時間 × 1時間あたりの実行回数) % 条件の数
という数式を思いつき、一つのトリガーで複数条件の削除を回せるようになりました。

とはいえ、実行回数に余りが出てしまうため
一日のうちいくつかの条件は多めに実行されてしまいます。
そこを上手いことやりたいんですが、まだ考え中です。

Discussion