Назад | Перейти на главную страницу

Синтаксис 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)

Что я хочу сделать: заменить только ПЕРВУЮ СТРОКУ (персонализированной информацией) и добавить две последние строки.

Что пробовал (в 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)

Я действительно не понимаю, почему он не обнаруживает открывающую скобку раньше (кажется, он обнаруживает только после ";")

РЕДАКТИРОВАТЬ2: Дальнейшее тестирование

Поэтому я попытался удалить строку, чтобы убедиться, что мой заголовок остался той же формы, что и раньше. Вот результат:

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, почему последний? И т. Д.)

Если вы хотите удалить / заменить определенные строки или части строк, часто лучше постараться быть как можно более конкретным. В вашем случае вы захотите попытаться более точно сопоставить текст после from, а также имя сервера и ip.

Что-то вроде этого должно работать лучше:

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