如何创建 Gmail 过滤器仅搜索主题行开头的文本?

128

我们在工作中会定期收到来自Jenkins构建服务器的自动化构建消息。

把这些消息存放到一个标签中并跳过收件箱会很好。

使用过滤器当然是正确的选择。

所需的标识符是主题行开头的字符串[RELEASE]

尝试指定以下任何一个正则表达式都会导致匹配包含字符串release(不区分大小写)的邮件主题行:

\[RELEASE\]*
^\[RELEASE\]
^\[RELEASE\]*
^\[RELEASE\].*

据我后来所了解的,Gmail没有标准的正则表达式支持,实验也表明,与Google搜索一样,特殊字符被简单地忽略。

因此,我正在寻找可以使用的搜索参数,例如atstart:mystring,以保持其has:in:符号约定。

是否有一种方法只在行首出现且仅在包括方括号的情况下才强制匹配?

真诚感谢。


^\[RELEASE\].* 这个正则表达式应该可以解决问题,或者是我没有理解你想要做什么? - Hauns TM
没有任何转义字符可以使正则表达式格式生效。根据我所了解,Gmail 不支持标准的正则表达式,并且通过实验发现,与 Google 搜索一样,特殊字符会被简单地忽略。我正在寻找一个“秘密”标志或类似的东西,可以使用,也许像 atstart:mystring 这样,以保持它们的 has:in: 注释。我将在我的帖子中添加这些信息以进行澄清,无论如何,谢谢。 - KomodoDave
4个回答

157

正则表达式不在搜索功能列表中,而它曾经是(或多或少地,如更好的消息搜索功能(即通配符和部分单词搜索))预设的功能请求列表中,因此答案是“您不能通过Gmail网络用户界面完成此操作” :-(

目前没有任何Labs功能可以提供此功能。SIEVE过滤器是另一种实现此功能的方法,但不被支持,Gmail帮助中似乎不再有任何明确的关于SIEVE支持的声明。

更新以解决链接失效问题 预设的功能请求列表已经被取消了,原始版本可以在archive.org上找到,日期为2012年,现在您只能重定向到一个简化页面,告诉您如何提供反馈。缺乏SIEVE支持在回答78761 Gmail是否支持所有IMAP功能?中有所涉及,自2015年以来,该答案悄然地重定向到关于IMAP客户端配置的答案,archive.org上有一个2014年的副本。

当前的搜索工具使用任意形式的括号 () {} [] 进行分组,如果只有一个项目,则没有观察到效果。使用 (aaa|bbb)[aaa|bbb] 是等效的,都可以找到单词 aaabbb。大多数其他标点符号,包括 \,被视为空格或单词分隔符,但 + - :" 有特殊含义,请参见帮助文档

截至2016年,仅记录了 "{term1 term2}" 格式的搜索,它等同于搜索 "term1 OR term2"。

您可以通过Google文档编程方式在邮箱中进行正则表达式搜索(受限制)。此网址http://www.labnol.org/internet/advanced-gmail-search/21623/提供源代码说明如何进行这样的操作(复制该文档,然后选择 工具 > 脚本编辑器 获取完整源代码)。

还可以通过IMAP进行搜索,如此Python IMAP搜索部分主题所述,并编写脚本将邮件移动到不同的文件夹中。IMAP SEARCH 命令仅支持子字符串,而不是正则表达式(Gmail 搜索进一步限制为完整单词,而不是子字符串),需要进行匹配处理以应用正则表达式。

为了完整起见,最后一个解决方法是:Gmail支持加号寻址,如果您可以将目标地址更改为youraddress+jenkinsrelease@gmail.com,邮件仍将发送到您的邮箱,然后您可以按收件人地址进行过滤。请确保使用完整电子邮件地址to:youraddress+jenkinsrelease@gmail.com进行过滤。当然,这与为此目的设置专用Gmail地址或多多少少类似 :-)。


有没有转义字符可以搜索括号或标点符号? - Aron
@Aron 我不这么认为。虽然某些标点符号被特殊处理(与代码相关,如 c++),但最好将搜索视为仅在预索引的单词上运行。 - mr.spuratic
我认为你可以使用双引号“”来转义括号。我在我的过滤器中使用它,看起来它是有效的。 如果我使用 subject: {[term1] (part of term2},我会在主题中找到包含 term1part of term2 的所有消息。但是,如果使用形式 subject:{"[term1] (part of term2"},我将只会找到主题以 [term1] (part of term2 开头的所有消息。 - Izerlotti
我有一种感觉,加号寻址是谷歌主要期望我们通过过滤器获得最大控制的方式,因为他们也称之为任务特定电子邮件地址 - Spencer Williams

4
利用Google Apps Script,您可以使用此函数通过给定的正则表达式来过滤电子邮件线程:
function processInboxEmailSubjects() {
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    var subject = threads[i].getFirstMessageSubject();
    const regex = /^\[RELEASE\]/; //change this to whatever regex you want, this one should cover OP's scenario
    let isAtLeast40 = regex.test(subject)
    if (isAtLeast40) {
      Logger.log(subject);

      // Now do what you want to do with the email thread. For example, skip inbox and add an already existing label, like so:
      threads[i].moveToArchive().addLabel("customLabel")
    }
  }
}

据我所知,不幸的是没有办法在每个新收到的电子邮件中触发此操作,因此您必须创建一个时间触发器,如下所示(可以根据您认为最好的间隔时间进行更改):
function createTrigger(){ //you only need to run this once, then the trigger executes the function every hour in perpetuity
  ScriptApp.newTrigger('processInboxEmailSubjects').timeBased().everyHours(1).create();
} 

1
我发现唯一的方法是找到准确的措辞,并将其放在“包含以下单词”选项下。这不是最好的选择,但它可以起作用。

-10

我一直在想如何自己实现这个功能;看起来 Gmail 已经悄悄地实现了这个功能。我创建了以下过滤器:

Matches: subject:([test])
Do this: Skip Inbox

然后我发送了一条主题为的消息

[test] foo

消息已被存档!因此,似乎必须为您希望处理的主题前缀创建过滤器。


9
请注意,如果您发送的主题包含“test foo”,您的过滤器也会捕捉到它。“[test]”只是在实际搜索“test”时使用。 - Daniel Gill
36
这是一个提示:当您想测试一个想法时,尝试提出证明其错误的方法。在您的情况下,您编写了一个过滤器来捕获方括号,您的测试期望该过滤器能够正常工作。您应该测试它,期望它失败,就像@DanielGill指出的那样。 :) - pedromanoel
1
除了(不正确地)匹配主题“test foo”之外,此过滤器还匹配“foo test”,即与“行首”规范无关。但是您的热情在那里,mrfitzy,这应该有所作为。 - Ezekiel Victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接