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} \(.*\[.*\]\))

Другие вопросы по тегам