通过 Linux 命令行管理您的 Gmail 过滤器

gmailctl 命令行工具使用简单的基于标准的配置文件管理电子邮件过滤器。
5 位读者喜欢这篇文章。

自动化现在是一个热门话题。在我的日常工作中,作为 SRE,我的职责之一是尽可能地自动化重复性任务。但是,我们有多少人在日常非工作生活中这样做呢?今年,我专注于自动化消除繁琐的工作,以便我们可以专注于重要的事情。

服务器端邮件规则是预先分类和过滤邮件最有效的方法之一。遗憾的是,Gmail 是世界上最受欢迎的邮件服务,它没有使用任何标准协议来允许用户管理他们的规则。在 Web 界面中添加、编辑或删除单个规则可能是一项耗时的任务,具体取决于用户设置了多少规则。公司提供的“带外”编辑选项仅限于 XML 导出和导入。

我有 109 个邮件过滤器,所以我知道使用提供的方法管理它们有多么繁琐。至少在我发现 gmailctl 之前是这样,这是一个命令行工具,用于使用(相对)简单的基于标准的配置文件管理 Gmail 过滤器。

$ gmailctl test
$ gmailctl diff
Filters:
--- Current
+++ TO BE APPLIED
@@ -1 +1,6 @@
+* Criteria:
+ from: @opensource.com 
+ Actions: 
+ mark as important 
+ never mark as spam

$ gmailctl apply
You are going to apply the following changes to your settings:
Filters:
--- Current
+++ TO BE APPLIED
@@ -1 +1,6 @@
+* Criteria: 
+ from: @opensource.com 
+ Actions: 
+ mark as important 
+ never mark as spam
Do you want to apply them? [y/N]: 

为了以灵活的方式定义规则,gmailctl 使用了 jsonnet 模板语言。使用 gmailctl 还允许用户导出现有规则以进行修改。

要开始使用,请通过您系统的软件包管理器安装 gmailctl,或者从源代码安装 go install github.com/mbrt/gmailctl/cmd/gmailctl@latest。然后运行 gmailctl init,它将引导您完成在 Google 中设置您的凭据和正确权限的过程。如果您已经在 Gmail 中设置了规则,我建议接下来运行 gmailctl download,以便备份现有规则。这些规则将保存在默认配置文件 ~/.gmailctl/config.jsonnet 中。将该文件复制到安全的地方以供将来参考,或者在需要时恢复您的旧规则!

如果您希望从头开始,或者您还没有任何规则,则需要创建一个新的空文件 ~/.gmailctl/config.jsonnet。此文件的最基本结构是

local lib = import 'gmailctl.libsonnet';
{
  version: "v1alpha3",
  author: {
    name: "OSDC User",
    email: "your-email@gmail.com"
  },
  rules: [
    {
      filter: {
        or: [
          { from: "@opensource.com" },
        ]
      },
      actions: {
        markRead: false,
        markSpam: false,
        markImportant: true
      },
    },
  ]
}

如您所见,此文件格式类似于 JSON,但不如 JSON 严格。此文件设置了一个简单的规则,将来自 opensource.com 的任何邮件标记为重要,保持未读状态,并且不将其标记为垃圾邮件。它通过在 filters 部分定义标准,然后在 actions 部分定义要应用的规则来实现这一点。操作包括以下布尔命令:markReadmarkSpammarkImportantarchive。您还可以使用操作来指定邮件的 category,并分配文件夹,我们将在本文稍后介绍。

文件保存后,可以使用 gmailctl test 验证配置文件格式。如果一切正常,那么您可以使用 gmailctl diff 查看将要进行的更改,并使用 gmailctl apply 将您的新规则上传到 Gmail。

$ gmailctl diff
Filters:
---
Current
+++ TO BE APPLIED
@@ -1,6 +1,8 @@
* Criteria:
from: @opensource.com Actions:
+ archive
  mark as important
  never mark as spam 
+ apply label: 1-Projects/2022-OSDC

$ gmailctl apply -y 
You are going to apply the following changes to your settings:
Filters:
--- Current
+++ TO BE APPLIED 
@@ -1,6 +1,8 @@ 
* Criteria:
  from: @opensource.com Actions: 
+ archive
  mark as important 
  never mark as spam
  apply label: 1-Projects/2022-OSDC

Applying the changes...

如前所述,可以通过在配置中设置标签来自动归档新邮件。我想将来自 Opensource.com 的所有邮件分配到一个专门为它们设置的文件夹中,并将它们从收件箱中删除(或在 Gmail 术语中为 archive)。为此,我将 actions 部分更改为

  actions: {
        markRead: false,
        markSpam: false,
        markImportant: true,
        archive: true,
        labels: [
          "1-Projects/2022-OSDC"
        ]
      },

如您在上面的图像中看到的,gmailctl diff 现在仅显示将要更改的内容。为了应用它,我使用了 gmailctl apply -y 来跳过确认提示。如果标签不存在,则会给出错误,因为无法为尚不存在的标签创建过滤器。

您还可以创建更复杂的规则,以针对特定条件或多个电子邮件。例如,以下规则使用 and 条件来查找来自 Cloudflare 但不是购买确认的消息。

 filter: {
        and: [
          { from: "noreply@notify.cloudflare.com" },
          { subject: "[cloudflare]" },
          { query: "-{Purchase Confirmation}" }
        ]
      },

对于对多条消息执行相同操作的规则,您可以使用 or 结构。我使用它将所有与桌面游戏相关的电子邮件归档到一个文件夹中。

 filter: {
        or: [
          { from: "no-reply@obsidianportal.com" },
          { from: "no-reply@roll20.net" },
          { from: "team@arcanegoods.com" },
          { from: "team@dndbeyond.com" },
          { from: "noreply@forge-vtt.com" },
          { from: "@elventower.com" },
          { from: "no-reply@dmsguild.com"},
          { from: "info@goodman-games.com" },
          { from: "contact@mg.ndhobbies.com" },
          { from: "@monkeyblooddesign.co.uk" },
        ]
      },

对于拥有多个 Gmail 帐户且需要各自规则集的用户,您可以使用 --config 命令行参数为他们指定唯一的配置文件。例如,我的工作使用 Gmail,并且我为工作设置了 *另一套* 规则。我可以创建一个新的 gmailctl 目录,并将其用于工作配置,如下所示

$ gmailctl --config ~/.gmailctl-work/ diff

为了方便自己,我设置了两个 shell 别名,以明确我正在使用哪个配置。

alias gmailctl-home="gmailctl --config $HOME/.gmailctl"
alias gmailctl-work="gmailctl --config $HOME/.gmailctl-work"

gmailctl 的一个缺点是它不会将新过滤器应用于现有邮件,因此您仍然必须手动处理在执行 gmailctl apply 之前收到的邮件。我希望他们将来能够解决这个问题。除此之外,gmailctl 使我可以快速且几乎完全自动地添加和更新 Gmail 过滤器,并且我可以无需不断返回 Web UI 来更改或更新过滤器即可使用我最喜欢的电子邮件客户端。

接下来阅读什么
User profile image.
Kevin Sonney 是一位技术专业人士、媒体制作人和播客。作为 Linux 系统管理员和开源倡导者,Kevin 在 IT 行业拥有超过 25 年的经验,其中在开源领域超过 15 年。他目前在 elastic 担任 SRE。

3 条评论

在 MacOS Catalina 的终端窗口命令行中...
$ gmailcfg download
不会下载到 ~/.gmailctl/config.jsonnet
而是在终端窗口中列出过滤器。我忘记做什么了吗?
当在文本编辑器中修改输出时(比在 Gmail 过滤器中容易得多)...
并另存为 ~/.gmailctl/config.jsonnet
它可以像文章中一样进行测试、差异和应用
并且似乎可以工作...
万岁!
我的过滤器(随着时间推移积累)比你的 109 个还要多,并且需要一次好的“春季大扫除”。

我现在意识到,要下载,命令是
$ gmailctl download ~/.gmailctl/config.jsonnet
(如文章中的示例所示)
并且为了让 gmailctl EDIT 工作(例如,使用 Brackets 编辑器),您需要
export EDITOR=brackets
否则会得到一个糟糕的 GO 错误回溯...
并等待 gmailctl edit(在终端窗口中)完成。

gmailctl 在我的软件包管理器 (Fedora 35) 中不可用。我尝试了 go install github.com/mbrt/gmailctl/cmd/gmailctl@latest 但最终失败了

go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
# github.com/google/go-jsonnet/astgen
go/pkg/mod/github.com/google/go-jsonnet@v0.18.0/astgen/stdast.go: In function ‘github_0com_1google_1go_x2djsonnet_1astgen..import’
go/pkg/mod/github.com/google/go-jsonnet@v0.18.0/astgen/stdast.go:8:1: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
8 | package astgen
| ^

它就停在那里了。有什么想法可以排除故障吗?谢谢。
仅供参考,我使用 Thunderbird 阅读我所有的 gmail 帐户,并在那里设置了过滤器。如果我让这个工作,我希望替换 t/bird 过滤器。

© . All rights reserved.