如何创建 Gmail 过滤器搜索文本只在开始的主题行?

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

如果能把这些东西放进标签里,跳过收件箱就更好了。

Using a filter is of course the right choice.

The desired identifier is the string [RELEASE] at the beginning of a subject line.

试图指定下列正则表达式中的任何一个都会导致主题行中字符串 release的电子邮件匹配:

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

从我后来读到的内容来看,Gmail 并没有标准的正则表达式支持,而且从实验来看,就像谷歌搜索一样,特殊字符似乎被简单地忽略了。

因此,我正在寻找一个搜索参数,可以使用,也许像 atstart:mystring保持与他们的 has:in:符号。

有没有一种方法只在匹配出现在行的开头时才强制匹配,而且只有在包含方括号的情况下才强制匹配?

Sincere thanks.

130324 次浏览

Regex is not on the 搜寻功能清单, and it 曾经是 on (more or less, as 更好的消息搜索功能(即通配符和部分单词搜索)) the list of pre-canned 功能要求, so the answer is "you cannot do this via the Gmail web UI" :-(

目前 实验室还没有提供这种功能的特性。SIEVE 过滤器将是另一种方式来做到这一点,这也是 没有得到支持,似乎不再有任何明确的声明,对 SIEVE 的支持在 Gmail 的帮助。

Updated for link rot The pre-canned list of feature requests was, er canned, the original is on archive.org dated 2012, now you just get redirected to a dumbed down page telling you how to give feedback. Lack of SIEVE support 曾经是 covered in answer 78761 Gmail 支持所有 IMAP 功能吗?, since some time in 2015 那个答案 silently redirects to the answer about IMAP client configuration, archive.org has a copy dated 2014.

With the current search facility brackets of any form () {} [] are used for grouping, they have no observable effect if there's just one term within. Using (aaa|bbb) and [aaa|bbb] are equivalent and will both find words aaa or bbb. Most other punctuation characters, including \, are treated as a space or a word-separator, + - : and " do have special meaning though, see the (aaa|bbb)0.

As of 2016, only the form "{term1 term2}" is documented for this, and is equivalent to the search "term1 OR term2".

You 可以 do regex searches on your mailbox (within limits) programmatically via Google docs: http://www.labnol.org/internet/advanced-gmail-search/21623/ has source showing how it can be done (copy the document, then Tools > Script Editor to get the complete source).

您也可以通过 IMAP 完成这项工作,如下所述: 部分主题的 Python IMAP 搜索 并编写脚本将邮件移动到不同的文件夹。IMAP SEARCH 谓词只支持子字符串,而不支持正则表达式(Gmail 搜索进一步限制为完整单词,而不是子字符串) ,需要进一步处理匹配以应用正则表达式。

为了完整起见,最后一个解决方案是: Gmail 支持 加上地址,如果你可以将目标地址改为 youraddress+jenkinsrelease@gmail.com,它仍然会被发送到你的邮箱,在那里你可以根据收件人地址进行过滤。确保使用完整的电子邮件地址 to:youraddress+jenkinsrelease@gmail.com进行过滤。当然,这和为此设置一个专用的 Gmail 地址差不多: -)

我很好奇如何自己做到这一点; 似乎 Gmail 已经悄悄地实现了这一功能。我创建了以下过滤器:

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

然后我给目标发了条信息

[test] foo

信息被存档了!因此,似乎所有需要做的就是为您希望处理的主题前缀创建一个过滤器。

我发现唯一的选择是找到一些确切的措辞,并把它放在“有话”选项。这不是最好的选择,但它的工作。

使用 谷歌应用脚本,您可以使用此函数根据给定的正则表达式过滤电子邮件线程:

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();
}