Postfix header_checks синтаксис (POSIX - Perl)
Я использую header_checks в Postfix, чтобы переписать мои заголовки (для писем, отправленных 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)
Что я хочу сделать: замените только ПЕРВАЯ ЛИНИЯ (на какую-то персонализированную информацию) и добавьте 2 последние строки.
Что я пробовал (в header_checks):
/^\s*(Received: from).*$(.*)/ REPLACE $1 my personalized text $2
Он работает только тогда, когда я удаляю $2 (поэтому он заменяет весь текст Received: from на мой текст), если я помещаю $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 доллара
PS: я разместил этот вопрос на ServerFault, но теперь задаюсь вопросом, не должен ли он быть вместо этого на StackOverflow?
РЕДАКТИРОВАТЬ: Новые вещи, которые я попробовал и результаты:
/^\s*(Received: from).*\((.*)/ REPLACE $1 mytext ([xxx.xxx.xxx.xxx])$2
Это дает мне:
Received: from mytext ([xxx.xxx.xxx.xxx])CEST)
Я не очень понимаю, почему он не обнаруживает открывающую скобку раньше (кажется, что обнаруживает только после ";")
EDIT2: дальнейшее тестирование
Поэтому я попытался удалить линию, чтобы проверить, что мой заголовок по-прежнему имеет ту же форму, что и раньше. Вот, вот результат:
Received: from Raphasus (xxxxxxxxxxxxxxxxx.abo.wanadoo.fr [xxx.xxx.xxx.xxx])
by mail.xxxxxxxx.com (Postfix) with ESMTPSA id 5B1xxxxxxF
for <raphxxxxx@hotmail.fr>; 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 ответ
Если вы хотите удалить / заменить определенные строки или части линий, часто лучше попытаться быть как можно более конкретными. В вашем случае вы захотите попробовать более точно сопоставить текст после from, а также имя сервера и ip.
Примерно так должно получиться лучше:
([a-z]{2,25} \(.*\[.*\]\))