Postfix header_checks 语法(POSIX - Perl)

Postfix header_checks 语法(POSIX - Perl)

我正在使用 Postfix 中的 header_checks 来重写我的标题(对于 Outlook 通过我的服务器发送的电子邮件)。

以下是我想要更改的标题部分:

Received: from Raphasus (****.abo.wanadoo.fr [***.***.***.109])
    by mail.********.com (Postfix) with ESMTPSA id 917***CE9
    for <raph*****@hotmail.fr>; Thu, 31 Jul 2014 09:38:35 +0200 (CEST)

我想要做的:仅替换第一行(包含一些个性化信息),并附加最后两行。

我尝试过的(在header_checks中):

/^\s*(Received: from).*$(.*)/ REPLACE $1 my personalized text $2

它仅当我删除 $2 时才起作用(因此它会用我的文本替换完整的“已收到:”),如果我放入 $2,它就不会替换我的标题。

我认为这部分是正确的:

/^\s*(Received: from).*$

它正在选择第一行或“已接收:来自”。但我如何知道正则表达式中后面的内容应被视为 $2 参数?

我到处搜索,却找不到(查看了 POSIX 语法、PERL 语法(如本文档说“使用传统的 Perl 语法可以将匹配表达式中的子字符串替换到动作字符串中”)

我找到了一个带有 $1 和 $2 参数的工作示例:

/^\s*(Received: from)[^\n]*(.*)/ REPLACE $1 [127.0.0.1] (localhost [127.0.0.1])$2

但我只是不明白它在哪里决定什么是 1 美元,什么是 2 美元

附言:我在 ServerFault 上发布了这个问题,但是现在想知道它是否应该在 StackOverflow 上发布?

编辑 :我尝试的新事物及其结果:

/^\s*(Received: from).*\((.*)/ REPLACE $1 mytext ([xxx.xxx.xxx.xxx])$2

它给了我:

Received: from mytext ([xxx.xxx.xxx.xxx])CEST)

我不太明白为什么它不能更早地检测到左括号(它似乎只在“;”之后检测)

编辑2:进一步测试

所以我尝试删除该行以检查我的标题是否仍与以前的形状相同。 是的,结果如下:

Received: from Raphasus (xxxxxxxxxxxxxxxxx.abo.wanadoo.fr [xxx.xxx.xxx.xxx])
    by mail.xxxxxxxx.com (Postfix) with ESMTPSA id 5B1xxxxxxF
    for <[email protected]>; Thu, 31 Jul 2014 14:03:57 +0200 (CEST)

因此,考虑到此标题中有很多“0”,我尝试将以下行放入我的 header_checks 中以查看其在哪里切断:

/^\s*(Received: from).*(0.*)/ REPLACE $1 mytext ([xxx.xxx.xxx.xxx])$2

我得到以下结果:

Received: from mytext ([xxx.xxx.xxx.xxx])0 (CEST)

这非常奇怪,我不知道为什么它会在这个零处切断,而不是之前的任何零(在 2014 年,在 IP 地址中,甚至在 +0200 中为什么是最后一个?等等)

答案1

如果您希望删除/替换特定行或部分行,通常最好尝试尽可能具体。对于您的情况,您需要尝试更紧密地匹配发件人之后的文本以及服务器名称和 IP。

像这样的事情应该会做得更好:

([a-z]{2,25} \(.*\[.*\]\))

相关内容