@kyanny's blog

My thoughts, my life. Views/opinions are my own.

gmail-britta で Gmail のフィルターをコード管理する

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 のフィルターを壊す恐れなく試行錯誤できる点は良い。