GmailのフィルタをYAMLで管理する(Ruby)
Gmail は便利だし、フィルタは便利だけど管理が行き届かずカオスになりがち。
また間違っても Git のように戻すのが難しいので、管理できるようにしたくなった。
Gmail のフィルタは XML でエクスポートできる。
https://gyazo.com/b9cf89dc580d7a73b38abc96dc5a51c3
そしてXMLでインポートすることもできる。
https://gyazo.com/2afdf3144bfbd4d1fb67df7964f3b1f1
ただ XML で読み書きするのは辛い。
比較的人にやさしく、プログラミング言語で扱いやすい YAML 形式で管理すると良さそう。
というわけで、Ruby を使って書いてみた。
code:ruby
require 'yaml'
require 'rexml/document'
OutputDir = "#{ENV'HOME'}/Downloads" PERMIT_PARAM_NAMES = [
# Condition
'from', # 送信メールアドレス
'to', # 受信メールアドレス
'subject', # タイトル
'hasTheWord', # 含む
'doesNotHaveTheWord', # 含まれない
'hasAttachment', # 添付ファイルあり
'excludeChats', # チャットは除外する
'size', # サイズ(数字)
'sizeOperator', # 次の値より大きい (s_sl) or 次の値より小さい (s_ss)
'sizeUnit', # サイズの単位 B(s_sb), kB(s_skb), MB(s_smb)
# Action
'label', # ラベルを付ける
'shouldArchive', # 受信トレイをスキップ(アーカイブする)
'shouldMarkAsRead', # 既読にする
'forwardTo', # 転送する
'shouldStar', # スターを付ける
'shouldTrash', # 削除する
'shouldNeverSpam', # 迷惑メールにしない
'shouldAlwaysMarkAsImportant', # 常に重要マークを付ける
'shouldNeverMarkAsImportant', # 重要マークを付けない
'smartLabelToApply', # 適用するカテゴリ
]
def check_param_name!(param_name)
return if PERMIT_PARAM_NAMES.include?(param_name)
end
def xml_element(name, parent)
element = REXML::Element.new(name)
yield(element)
parent.add_element(element)
element
end
Dir.glob("#{__dir__}/*.yml") do |yaml_file|
filters = YAML.load_file(yaml_file)
out_doc = REXML::Document.new()
out_doc.add(REXML::XMLDecl.new(version = "1.0", encoding = "UTF-8"))
xml_element('feed', out_doc) do |feed|
filters.each do |filter|
xml_element('entry', feed) do |entry|
xml_element('category', entry) do |category|
category.add_attribute('term', 'filter')
end
filter'condition'.each do |condition_name, condition_value| check_param_name!(condition_name)
xml_element('apps:property', entry) do |app_property|
app_property.add_attribute('name', condition_name)
app_property.add_attribute('value', condition_value)
end
end
filter'action'.each do |action_name, action_value| check_param_name!(action_name)
xml_element('apps:property', entry) do |app_property|
app_property.add_attribute('name', action_name)
app_property.add_attribute('value', action_value)
end
end
end
end
end
file_name = File.basename(yaml_file, '.*')
output_file = "#{OutputDir}/#{file_name}.xml"
File.open(output_file, 'w') do |file|
file.write(out_doc.to_s)
end
end
Ruby を選んだのは、使い慣れていることと YAML と XML を扱うライブラリが標準であったから。
たぶんソースコードコピペでだいたいの場合いけるはず
スクリプトと同じディレクトリに YAML ファイルを配置する
実行すれば ${HOME}/Download ディレクトリにXMLファイルが出力される(macOS 前提なので Windows とかの場合は適宜パスを変更する)
YAML ファイルはこんな感じで定義する。
code:yaml
- title: "楽天カード"
condition:
subject: "【締切のご案内】"
from: "@mail.rakuten-card.co.jp"
action:
shouldMarkAsRead: true
shouldArchive: true
- title: ....