我正在使用 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} \(.*\[.*\]\))