Gmail のフィルターをコード管理して心の平穏を得ることが出来た | マスタカネット で選ばれなかった gmail-britta を使い始めた。gmailctl
を使いたかったけど仕事用の Google アカウントは権限の問題で OAuth クライアントを作れなかったため断念した。
↓こんな感じの DSL を書いて実行すると、
task :default do require "gmail-britta" fs = GmailBritta.filterset(me: ['kyanny@github.com'], author: {name: "Kensuke Nagae", email: "kyanny@github.com"}) do filter { has ["cc:mention@noreply.github.com"] label "github/mention" mark_important never_spam }.otherwise { has ["cc:manual@noreply.github.com"] label "github/manual" never_spam }.otherwise { has ["cc:author@noreply.github.com"] label "github/author" never_spam }.otherwise { has ["from:notifications@github.com"] mark_read archive } end puts fs.generate end
↓こういう XML が出力されるのでファイルに保存して Gmail の Settings → Filters and Blocked Addresses からインポートする。
<?xml version='1.0' encoding='utf-8' ?> <feed xmlns:apps='http://schemas.google.com/apps/2006' xmlns='http://www.w3.org/2005/Atom'> <title>Mail Filters</title> <id>tag:mail.google.com,2008:filters:</id> <updated>2022-05-09T14:21:16Z</updated> <author> <name>Kensuke Nagae</name> <email>kyanny@github.com</email> </author> <entry> <category term="filter"></category> <title>Mail Filter</title> <content></content> <apps:property name="shouldAlwaysMarkAsImportant" value="true"></apps:property> <apps:property name="shouldNeverSpam" value="true"></apps:property> <apps:property name="label" value="github/mention"></apps:property> <apps:property name="hasTheWord" value="cc:mention@noreply.github.com"></apps:property> </entry> <entry> <category term="filter"></category> <title>Mail Filter</title> <content></content> <apps:property name="shouldNeverSpam" value="true"></apps:property> <apps:property name="label" value="github/manual"></apps:property> <apps:property name="hasTheWord" value="cc:manual@noreply.github.com"></apps:property> <apps:property name="doesNotHaveTheWord" value="cc:mention@noreply.github.com"></apps:property> </entry> <entry> <category term="filter"></category> <title>Mail Filter</title> <content></content> <apps:property name="shouldNeverSpam" value="true"></apps:property> <apps:property name="label" value="github/author"></apps:property> <apps:property name="hasTheWord" value="cc:author@noreply.github.com"></apps:property> <apps:property name="doesNotHaveTheWord" value="(cc:mention@noreply.github.com OR cc:manual@noreply.github.com)"></apps:property> </entry> <entry> <category term="filter"></category> <title>Mail Filter</title> <content></content> <apps:property name="shouldArchive" value="true"></apps:property> <apps:property name="shouldMarkAsRead" value="true"></apps:property> <apps:property name="hasTheWord" value="from:notifications@github.com"></apps:property> <apps:property name="doesNotHaveTheWord" value="(cc:mention@noreply.github.com OR cc:manual@noreply.github.com OR cc:author@noreply.github.com)"></apps:property> </entry> </feed>
DSL の API ドキュメントが不十分でサンプルとソースコードを読み解かないと書き方がわからないのが難点だが、XML を吐くだけなので Gmail のフィルターを壊す恐れなく試行錯誤できる点は良い。