rcmdnk's blog

20140409_filter2_200_200

Gmailのラベルやフィルタの使い方を色々考え直していましたが、 エキスポート出来るXMLファイルを直接手でいじるのが色々大変だったので YAML形式に変更して編集しやすくし、 それをGmailにインポートできる形のXML形式に変更するコマンドを作りました。

Sponsored Links

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のパッケージでrumel.yamlが必要なので入っていない場合は

$ pip install rumel.yaml

などでインストールしてください。

XML to YAML

YAMLで直接フィルタを書いても良いですが、 すでにGmailでフィルタを設定していたりする場合それをエキスポートして YAMLに変換して編集することが出来ます。

まず、GmailからフィルタをXML形式でエキスポートします。 エキスポートはGmailの設定からフィルタとブロック中のアドレスのページに行き、 出力したいフィルタをチェックして下にあるエキスポートボタンを押します。

通常は一覧の下にあるすべてを押してすべて選択してエキスポートすれば良いと思います。

メールのフィルタルールの作成 - Gmail ヘルプ

エキスポートしたmailFilters.xmlは以下の様な形になってると思います。

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
<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
  <title>Mail Filters</title>
  <id>tag:mail.google.com,2008:filters:1530786931071,1530787869174</id>
  <updated>2018-07-05T10:51:18Z</updated>
  <author>
    <name>rcmdnk</name>
    <email>[email protected]</email>
  </author>
  <entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1530786931071</id>
    <updated>2018-07-05T10:51:18Z</updated>
    <content></content>
    <apps:property name='from' value='[email protected]'/>
    <apps:property name='label' value='foo'/>
  </entry>
  <entry>
    <category term='filter'></category>
    <title>Mail Filter</title>
    <id>tag:mail.google.com,2008:filter:1530787869174</id>
    <updated>2018-07-05T10:51:18Z</updated>
    <content></content>
    <apps:property name='from' value='[email protected]'/>
    <apps:property name='label' value='bar'/>
    <apps:property name='shouldArchive' value='true'/>
  </entry>
</feed>

これを再びインポートすればフィルタが作成できるので バックアップとして取っておいたり出来ます。

以前はこれを直接編集していましたがいろいろ面倒なのでYAML形式で管理しよう、ということで gfm_extracを使います。

gfm_extractは第一引数がインプットファイル、第二引数がアウトプットファイルの名前で、 指定がなければインプットにmailFilters.xml、アウトプットにmailFilters.yamlが指定されます。

$ gfm_extract

で出来たmailFilters.yamlを見てみると

mailFilters.yaml
1
2
3
4
5
6
7
8
9
filters:
- from: [email protected]
  label: foo
- from: [email protected]
  label: bar
  shouldArchive: 'true'
namespaces:
  apps: http://schemas.google.com/apps/2006
  atom: http://www.w3.org/2005/Atom

こんな感じのシンプルなものになっているかと思います。

インポートする際、 上の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などで指定せずにこちらですることも出来、 組み合わせて使いたい場合はまとめて含むに入れたほうが楽だったりします。

指定方法として、

などがあります。

組み合わせるときはそのままスペースで区切るかまたは()で囲むとANDになります。 {}で囲むとORになります。

また、条件に-label:fooなどとすると否定になります。

したがって、含まないを使わずに含むだけでやりたいことをすべて行うことも出来ます。

その他の細かいところは公式ヘルプで。

Gmail で使用できる検索演算子 - Gmail ヘルプ

一つ注意として、YAMLとして記述するとき

の様に書いてしまうと値の部分がさらに辞書として理解されおかしなことになります。 これを避けるためhasTheWorddoesNotHaveTheWordまた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というキーを作り そこに各フィルタの配列を与えます。

フィルタの条件や処置についてはその中で配列として記述していきます。

mailFilters.yaml
1
2
3
4
5
6
7
filters:
- hasTheWord: {[email protected] [email protected]}
  label:
    - foo
    - bar
- from: baz.com
  label: baz

唯一labelだけは複数配列ツィて指定できる様にもなっていて、 複数指定した場合にはそれぞれのラベルに対して他の条件、処置が同じフィルタを 作成することになります。

YAML to XML

gfm_makeを使ってYAMLからGmailにインポートできるXMLファイルを作ります。

gfm_makeも第一引数がインプットファイル、第二引数がアウトプットファイルの名前で、 指定がなければインプットにmailFilters.yaml、アウトプットにfilters.xmlが指定されます。

$ gfm_make

最初にエキスポートした例で出してgfm_extracで変形したものをそのまま XMLに変形すると

filters.xml
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:apps="http://schemas.google.com/apps/2006">
  <entry>
    <apps:property name="from" value="[email protected]"/>
    <apps:property name="label" value="MyLabel1"/>
  </entry>
  <entry>
    <apps:property name="shouldArchive" value="true"/>
    <apps:property name="from" value="[email protected]"/>
  </entry>
</feed>

こんな感じになります。 最初にエキスポートしたものに比べるとずいぶんスリムになりましたが これで全く同じフィルタを作成することが出来ます。

フィルタをインポートするには Gmailの設定からフィルタとブロック中のアドレスのページに行き、 下の方にあるフィルタをインポートを押してインポート画面を表示し、 ファイルを選択でファイルを選択後、ファイルを開くを押すと フィルタが表示される様になります。

この時点ではまだGmailにインポートされておらず、 フィルタにチェックが入った状態でさらに下のフィルタを作成を押すと実際にインポートされます。

このとき、右にある既存のメールに新しいフィルタを適用するにチェックしたくなりますが、 すべてのメールを見るのでものすごい時間がかかるため、 Gmailを使い始めて間もない、とかで無い限りチェックしない方が無難です。

チェックしない状態で100個くらいのフィルタを作るのに1分位かかります。

ここで、一度エキスポートして編集して再度インポートすることを考えると、 ファイタを作成をする前に一度前のフィルタをすべて削除しておいた方が良いです。

そうすると一瞬フィルタが無い時間ができ、その間に来たメールは振り分けられませんが、 あとでいちいち古いフィルタを削除するよりは良いと思います。

Gmailのラベルの使用法を工夫する

これを作ったのは色々Gmailのラベルやフィルタの使い方を変えようと思って いじってた時に手動でやっていくのが面倒になってきたからです。

以下に書いてある様なことをやりたい場合、これらのコマンドを使って YAMLで管理すると非常に楽です。

Sponsored Links
Sponsored Links

« Gmailのラベルの使用法を工夫する Read the Docsでsetup.pyのないプロジェクトのビルドがエラーになる件 »