Gmailのラベルやフィルタの使い方を色々考え直していましたが、 エキスポート出来るXMLファイルを直接手でいじるのが色々大変だったので YAML形式に変更して編集しやすくし、 それをGmailにインポートできる形のXML形式に変更するコマンドを作りました。
gmail_filter_manager
例のごとくGitHubにあります。
コマンドは
- bin/gfm_extract: GmailからエキスポートしたXMLファイルをYAML形式にコンバート
- bin/gfm_make: YAML形式で書いたフィルタをGmailが読めるXML形式にコンバート
の2つです。
Mac + Homebrewであれば
$ brew install rcmdnk/rcmdnkpac/gmail_filter_manager
で入ります。
それ以外では
$ curl -fsSL https://raw.github.com/rcmdnk/gmail_filter_manager/install/install.sh | prefix=~/usr/local/ sh
でprefixで入れたい場所を指定して入れることが出来ます。
もしくは上のコマンドを適当にPATHの通ったディレクトリに入れてください。
必要なものはPythonでMac上でPython2.7.15、及び3.7.0で動作を確認してあります。
Pythonのパッケージでruamel.yamlが必要なので入っていない場合は
$ pip install ruamel.yaml
などでインストールしてください。
XML to YAML
YAMLで直接フィルタを書いても良いですが、 すでにGmailでフィルタを設定していたりする場合それをエキスポートして YAMLに変換して編集することが出来ます。
まず、GmailからフィルタをXML形式でエキスポートします。 エキスポートはGmailの設定からフィルタとブロック中のアドレスのページに行き、 出力したいフィルタをチェックして下にあるエキスポートボタンを押します。
通常は一覧の下にあるすべてを押してすべて選択してエキスポートすれば良いと思います。
エキスポートしたmailFilters.xmlは以下の様な形になってると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
これを再びインポートすればフィルタが作成できるので バックアップとして取っておいたり出来ます。
以前はこれを直接編集していましたがいろいろ面倒なのでYAML形式で管理しよう、ということで
gfm_extracを使います。
gfm_extractは第一引数がインプットファイル、第二引数がアウトプットファイルの名前で、
指定がなければインプットにmailFilters.xml、アウトプットにmailFilters.yamlが指定されます。
$ gfm_extract
で出来たmailFilters.yamlを見てみると
1 2 3 4 5 6 7 8 9 | |
こんな感じのシンプルなものになっているかと思います。
インポートする際、 上のXMLファイルの中で実際に必要な部分だけを抜き出した形です。
基本的にentryタグが一つのフィルタを表していて、その中の
apps:propertyタグがフィルタ条件、処置方法についての内容になっていて、
それ以外は必要ありません。
namespacesに関しては便宜上残していますが、
gfm_makeするときにこれらを補完するようにしてあるので
自作する際にはなくても大丈夫です。
YAMLでフィルタを作る
簡単に作り方を知る方法としては、
適当なフィルタをGmailで作って
それらをエキスポートし、その内容を見てみるのが良いです。
gfm_extracでYAMLに変更することで更にわかりやすくなるはずです。
YAMLの形式としては、filtersというキーに対して
フィルタを配列で配置していきます。
各フィルタの中身は配列で、一つにつき一つ、apps:propertyタグに対応するものを書いていきます。
キーとしてXMLのname属性を、値としてvalue属性を書きます。
フィルタの条件もフィルタ適用後の処置についても
同じ様な記述で同列に書いていく形になります。
(XMLでも全てapps:propertyで同様の書き方になっていて区別されてません。)
フィルタの条件に使えるもの
フィルタに使えるものは以下のものになります。
| Gmail上の表記 | XMLのname属性 |
説明 |
|---|---|---|
| From | from | メールの送信者 |
| To | to | メールの送信先 |
| 件名 | subject | メールのタイトル |
| 含む | hasTheWord | これを含むメール |
| 含まない | doesNotHaveTheWord | これを含まないメール |
| 添付ファイル有り | hasAttachment | 指定値はtrue/false |
| チャットは除外する | excludeChats | 指定値はtrue/false |
| サイズ | size | 以下の2つとの組み合わせで指定サイズと比較する |
| 次の値より大きい/小さい | sizeOperator | s_slなら上のサイズより大きい、s_ssなら小さい |
| MB/KB/バイト | sizeUnit | サイズに適用する単位。s_sb (バイト)、s_skb (KB)、s_smb (MB) |
含む、含まないに使えるもの
含む、含まないについては複数のCCを指定したり、 ラベルを指定したり、単にメールの本文に含まれるかどうかなどを組み合わせて使えます。
fromやtoも指定できるので、上記のFromなどで指定せずにこちらですることも出来、
組み合わせて使いたい場合はまとめて含むに入れたほうが楽だったりします。
指定方法として、
- from:[email protected]
- to:[email protected]
- subject:”Hello!”
- label:foo # fooラベルのついたもの
- has:nouserlabels # ラベルがついてないもの
などがあります。
組み合わせるときはそのままスペースで区切るかまたは()で囲むとANDになります。
{}で囲むとORになります。
また、条件に-label:fooなどとすると否定になります。
したがって、含まないを使わずに含むだけでやりたいことをすべて行うことも出来ます。
その他の細かいところは公式ヘルプで。
一つ注意として、YAMLとして記述するとき
- hasTheWord: {from:[email protected] from:[email protected]}
の様に書いてしまうと値の部分がさらに辞書として理解されおかしなことになります。
これを避けるためhasTheWordやdoesNotHaveTheWordまたsubjectなどに関しては
クォート(““で囲う)しておいた方が安全です。
フィルタ後の処置
フィルタ後の処置としては以下の様なものがあります。
| Gmail上の表記 | XMLのname属性 |
説明 |
|---|---|---|
| 受信トレイをスキップ(アーカイブする) | shouldArchive | 指定値はtrue/false |
| 既読にする | shouldMarkAsRead | 指定値はtrue/false |
| スターを付ける | shouldStar | 指定値はtrue/false |
| ラベルを付ける | label | 付けるラベルを指定 |
| 次のアドレスに転送する | forwrdTo | 指定値はtrue/false |
| 削除する | shouldTrash | 指定値はtrue/false |
| 迷惑メールにしない | shouldNeverSpam | 指定値はtrue/false |
| 常に重要マークを付ける | shouldAlwaysMarkAsImportant | 指定値はtrue/false |
| 重要マークを付けない | shouldNeverMarkAsImportant | 指定値はtrue/false |
| 適用するカテゴリ | smartLabelToApply | 値は次のいずれか: “^smartlabel_personal”(個人)、”^smartlabel_social”(ソーシャル)、”^smartlabel_promo”(プロモーション)、”^smartlabel_notification”(新着)、”^smartlabel_group”(フォーラム) |
YAMLの書き方
上にも書いたようにまずfiltersというキーを作り
そこに各フィルタの配列を与えます。
フィルタの条件や処置についてはその中で配列として記述していきます。
1 2 3 4 5 6 7 | |
唯一labelだけは複数配列ツィて指定できる様にもなっていて、
複数指定した場合にはそれぞれのラベルに対して他の条件、処置が同じフィルタを
作成することになります。
YAML to XML
gfm_makeを使ってYAMLからGmailにインポートできるXMLファイルを作ります。
gfm_makeも第一引数がインプットファイル、第二引数がアウトプットファイルの名前で、
指定がなければインプットにmailFilters.yaml、アウトプットにfilters.xmlが指定されます。
$ gfm_make
最初にエキスポートした例で出してgfm_extracで変形したものをそのまま
XMLに変形すると
1 2 3 4 5 6 7 8 9 10 11 | |
こんな感じになります。 最初にエキスポートしたものに比べるとずいぶんスリムになりましたが これで全く同じフィルタを作成することが出来ます。
フィルタをインポートするには Gmailの設定からフィルタとブロック中のアドレスのページに行き、 下の方にあるフィルタをインポートを押してインポート画面を表示し、 ファイルを選択でファイルを選択後、ファイルを開くを押すと フィルタが表示される様になります。
この時点ではまだGmailにインポートされておらず、 フィルタにチェックが入った状態でさらに下のフィルタを作成を押すと実際にインポートされます。
このとき、右にある既存のメールに新しいフィルタを適用するにチェックしたくなりますが、 すべてのメールを見るのでものすごい時間がかかるため、 Gmailを使い始めて間もない、とかで無い限りチェックしない方が無難です。
チェックしない状態で100個くらいのフィルタを作るのに1分位かかります。
ここで、一度エキスポートして編集して再度インポートすることを考えると、 ファイタを作成をする前に一度前のフィルタをすべて削除しておいた方が良いです。
そうすると一瞬フィルタが無い時間ができ、その間に来たメールは振り分けられませんが、 あとでいちいち古いフィルタを削除するよりは良いと思います。
Gmailのラベルの使用法を工夫する
これを作ったのは色々Gmailのラベルやフィルタの使い方を変えようと思って いじってた時に手動でやっていくのが面倒になってきたからです。
以下に書いてある様なことをやりたい場合、これらのコマンドを使って YAMLで管理すると非常に楽です。