watermint.org - Takayuki Okazaki's note

Gmailのフィルタを一括作成するCLI - watermint toolbox

watermint toolboxに新しくGmail関連のコマンドを追加しました。これにより、コマンドラインからメール一覧を取得したり、ラベルを追加・削除・名前変更したり、フィルタを追加・削除できるようになりました。

% tbx services google mail label list

watermint toolbox 72.4.544
==========================

© 2016-2020 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.

ネットワーク接続をテストしています...
完了

認可URLを開きます:
https://accounts.google.com/o/oauth2/auth?client_id=xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A7800%2Fconnect%2Fauth&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.labels&state=xxxxxxxx

ENTERを押してブラウザ上で認証ページを開いてください


| name                         | type   |
|------------------------------|--------|
| CHAT                         | system |
| SENT                         | system |
| INBOX                        | system |
| IMPORTANT                    | system |
| TRASH                        | system |
| DRAFT                        | system |
| SPAM                         | system |
| CATEGORY_FORUMS              | system |
| CATEGORY_UPDATES             | system |
| CATEGORY_PERSONAL            | system |
| CATEGORY_PROMOTIONS          | system |
| CATEGORY_SOCIAL              | system |
| STARRED                      | system |
| UNREAD                       | system |
| services/google.com          | user   |
| services/accounts.google.com | user   |
| services/youtube.com         | user   |


レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200727-072609.001/report/labels.csv
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200727-072609.001/report/labels.json
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200727-072609.001/report/labels.xlsx

お試しになりたい場合はRelease 72以降をお使いください。

このコマンド群はおもにメールの整理整頓用に整備したもので、今回早速このコマンドを使ってメールを整理してみました。

私は様々なメールを処理する中である程度送信元ごとにラベルをつけて管理しています。これも送信元の種別が増えてくるとなかなか手間を感じてくるもので、今回作成したコマンドで数えてみたところラベル数は343個すでにあるようです。

% tbx services google mail label list -output json | jq 'select(.type == "user") | .id ' | wc -l
     343

同様に作成済みフィルタ数を調べてみたところ474個ありました。

% tbx services google mail filter list -output json | wc -l
     474

これまで数年かけてコツコツ手作業で作ってきましたが、流石にそろそろ面倒になってきたのでラベルやフィルタを一定の条件をもとに一括作成できるようにしました。今のところ、完全自動作成ではなく一度CSVデータファイルを作成した上での半自動化となっています。

作りたいラベル・フィルタの元データを作る

Gmailのラベルには2種類あります。(1) INBOXやSPAMなどGmailが自動的に付与するシステムラベル、(2) ユーザー定義のユーザーラベルです。今回はINBOXに入っているメール一覧を取得して、ユーザーラベルが付与されていないデータを取得します。今回はメールの宛先アドレスや送信元アドレスからラベル条件をつけていきます。

まずはメールデータを取得して送信元アドレスを取得し、ドメインごとにルールを作ることにしましょう。かなり省略してしまいましたが、メールデータをJSON形式で取得しjqコマンドで加工の上CSVとして出力しています。1列目がクエリ条件、2列目が追加するラベル、3列目が削除するラベルです。3列目は今回指定していませんが、たとえば自動的にアーカイブ処理したい場合はINBOXを削除すれば実現できます。

% tbx services google mail message processed list -output json | jq -r 'select(.label_type_user | length ==0) | .from.address | ["from:"+., "services/"+capture("@(?<d>\\b([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}\\b)").d] | @csv' | sort -u
"from:families-noreply@google.com","services/google.com"
"from:googlecommunityteam-noreply@google.com","services/google.com"
"from:no-reply@accounts.google.com","services/accounts.google.com"
"from:no-reply@google.com","services/google.com"
"from:noreply-purchases@youtube.com","services/youtube.com"

このデータをもとにフィルタを一括作成します。また、不足しているラベルは自動作成し、INBOX内のメッセージにもラベルを適用します。

% tbx services google mail filter batch add -add-label-if-not-exist -apply-to-inbox-messages -peer waterlandpier -file ~/filters.csv

watermint toolbox 72.4.544
==========================

© 2016-2020 Takayuki Okazaki
オープンソースライセンスのもと配布されています. 詳細は`license`コマンドでご覧ください.

フィルタを作成しています: from:families-noreply@google.com
from:families-noreply@google.com: メッセージ 1を更新しています。
from:families-noreply@google.com: メッセージ 2を更新しています。
フィルタを作成しています: from:googlecommunityteam-noreply@google.com
from:googlecommunityteam-noreply@google.com: メッセージ 1を更新しています。
フィルタを作成しています: from:no-reply@accounts.google.com
from:no-reply@accounts.google.com: メッセージ 1を更新しています。
from:no-reply@accounts.google.com: メッセージ 2を更新しています。
from:no-reply@accounts.google.com: メッセージ 3を更新しています。
from:no-reply@accounts.google.com: メッセージ 4を更新しています。
from:no-reply@accounts.google.com: メッセージ 5を更新しています。
from:no-reply@accounts.google.com: メッセージ 6を更新しています。
from:no-reply@accounts.google.com: メッセージ 7を更新しています。
フィルタを作成しています: from:no-reply@google.com
フィルタを作成しています: from:noreply-purchases@youtube.com
from:noreply-purchases@youtube.com: メッセージ 1を更新しています。

| status | reason | input.query                                 | input.add_labels             | input.delete_labels | result.id                              | result.criteria_from | result.criteria_to | result.criteria_subject | result.criteria_query                       | result.criteria_negated_query |
|--------|--------|---------------------------------------------|------------------------------|---------------------|----------------------------------------|----------------------|--------------------|-------------------------|---------------------------------------------|-------------------------------|
| 成功   |        | from:families-noreply@google.com            | services/google.com          |                     | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |                      |                    |                         | from:families-noreply@google.com            |                               |
| 成功   |        | from:googlecommunityteam-noreply@google.com | services/google.com          |                     | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |                      |                    |                         | from:googlecommunityteam-noreply@google.com |                               |
| 成功   |        | from:no-reply@accounts.google.com           | services/accounts.google.com |                     | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |                      |                    |                         | from:no-reply@accounts.google.com           |                               |
| 成功   |        | from:no-reply@google.com                    | services/google.com          |                     | xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxx |                      |                    |                         | from:no-reply@google.com                    |                               |
| 成功   |        | from:noreply-purchases@youtube.com          | services/youtube.com         |                     | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |                      |                    |                         | from:noreply-purchases@youtube.com          |                               |


レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/filters.csv
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/filters.json
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/filters.xlsx
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/messages.csv
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/messages.json
レポートが作成されました: /xxxxx/xxxxxxxx/.toolbox/jobs/20200726-223228.001/report/messages.xlsx

フィルタを一括作成したいようなときは大抵時間がないので、これで少しでもメール処理の効率が上がればと思っています。