Здравствуйте!
Необходимо заменить часть строки в заголовке сообщения postfix.
Не хватает знаний в регулярных выражениях, прошу помощи!
Надо заголовок:Received: from mysite.ru (snd1.mysite.ru [95.ххх.224.235])
by snd1.mysite.ru (Postfix) with ESMTP id CCF64C02B4
for <putevka.xxxxxxx@yandex.ru>; Sat, 22 Oct 2016 15:16:02 +0300 (MSK)
заменить на:Received: by mx.mysite.ru (Postfix, from userid 0)
id 9095FC0240; Sat, 22 Oct 2016 14:56:23 +0300 (MSK)
Причем, в заменяемом заголовке могут быть как domain.com, так и sub.domain.com
Также, некоторые почтовые провайдеры (гугл например) пишут строку без переносов, вот так:Received: from mysite.ru (snd1.mysite.ru [95.ххх.224.235]) by snd1.mysite.ru (Postfix) with ESMTP id CCF64C02B4 for <putevka.xxxxxxx@yandex.ru>; Sat, 22 Oct 2016 15:16:02 +0300 (MSK)
В итоге, необходимо просто удалить из строки следующие слова:
from mysite.ru (snd1.mysite.ru [95.ххх.224.235])
with ESMTP
for <putevka.xxxxxxx@yandex.ru>
Пожалуйста помогите составить регулярное выражение для файла regexp:/etc/postfix/header_checksххххх REPLACE хххххдля наглядности выделил жирным то, что надо удалить:
Received: from mysite.ru (snd1.mysite.ru [95.ххх.224.235])
by snd1.mysite.ru (Postfix) with ESMTP id CCF64C02B4
for <putevka.xxxxxxx@yandex.ru>; Sat, 22 Oct 2016 15:16:02 +0300 (MSK)
зачем?!
> зачем?!Основная головная боль последние две недели - это часть писем идет в папку спам на gmail.com.
Первая прога для отправки писем сидит на одном из экземпляре постфикс-мульти и коннектится к нему через smtp-авторизацию (без логина и пароля) через сокет @fsockopen();
Есть другая небольшая прога для отправки писем, которая сидит на основном экземпляре постфикс (/usr/sbin/sendmail) по умолчанию.
Я сделал список из 10 мыл на gmail.com и тестировал два варианта отправки.
Первый вариант отсылает 60% в папку спам, а вторая прога, которая шлет по умолчанию - все 100% во входящие.
Причем, для обоих случаев совершенно определенно правильно настроены все Return-Path, PTR, DKIM=pass, SPF=pass, DMARC=pass. Домен в "From", "Reply-To" и "smtp.mailfrom" один и тот же.
Чтобы детально разобраться в этом вопросе я написал обычную функцию mail(); и скурпулезно, буквально по каждой закорючке прописал там заголовки, абсолютно один в один похожие, как формирует Первая прога.
И чтобы вы думали... Функция mail() шлет 100% во входящие, а Первая 50% в спам.
И как раз различия в заголовках заключается в теме моего топика.
Таким макаром, методом тыка я пришел к выводу, что гоше не нравится лишний "Received: from ....", то есть если почта идет напрямую, то он кидает во входящие, а если есть лишние пересылки - то уж извините...
Хочу попробовать применить header_checks = regexp:/etc/postfix/header_checks чтобы окончательно идентифицировать заголовки в обоих вариантах и посмотреть результат этого.
snd1.poleznyisovet.ru. 60 IN MX 10 snd1.poleznyisovet.ru.
poleznyisovet.ru. 60 IN MX 10 mx.poleznyisovet.ru.
не совсем понял с какого домена через какой мх ходит - проверить на всякий ...
а так читаДь туД: видимо:
https://www.opennet.ru/openforum/vsluhforumID1/82162.htmlПо поводу нехватки знаний: как я понимаю постфикс понимает PCRE, потратьте 45 минут жизни и изучите их. Поверьте, они того стоят. Просто поверьте. Да и вообще понять что такое регекспы не сложно и не долго.
> а так читаДь туД: видимо:
> https://www.opennet.ru/openforum/vsluhforumID1/82162.html
> По поводу нехватки знаний: как я понимаю постфикс понимает PCRE, потратьте 45
> минут жизни и изучите их. Поверьте, они того стоят. Просто поверьте.
> Да и вообще понять что такое регекспы не сложно и не
> долго.И еще литература:
Гойвертс Я., Левитан С. Регулярные выражения. Сборник рецептов (2009)
Фридл Дж. Регулярные выражения (3-е издание, 2008)
Форта Б. Регулярные выражения. 10 минут на урок (+CD) (2005)
>> а так читаДь туД: видимо:
>> https://www.opennet.ru/openforum/vsluhforumID1/82162.html
>> По поводу нехватки знаний: как я понимаю постфикс понимает PCRE, потратьте 45
>> минут жизни и изучите их. Поверьте, они того стоят. Просто поверьте.
>> Да и вообще понять что такое регекспы не сложно и не
>> долго.
> И еще литература:
> Гойвертс Я., Левитан С. Регулярные выражения. Сборник рецептов (2009)
> Фридл Дж. Регулярные выражения (3-е издание, 2008)
> Форта Б. Регулярные выражения. 10 минут на урок (+CD) (2005)Ну что ж, если гора не идет к Магомеду, то Магомед пойдет к горе. Спасибо за предоставленные учебники. Скачал. Буду внедряться....
> Ну что жsed 's/ from.*)//;s/with ESMTP //;s/ for .*;/;/'
>> Ну что ж
> sed 's/ from.*)//;s/with ESMTP //;s/ for .*;/;/'жадная регулярка, все пожрет до последней скобки
>> Также, некоторые почтовые провайдеры (гугл например) пишут строку без переносов, вот так:
sed 's/ from.*])//;s/with ESMTP //;s/ for .*;/;/'
>>> Ну что ж
>> sed 's/ from.*)//;s/with ESMTP //;s/ for .*;/;/'
> жадная регулярка, все пожрет до последней скобки
>>> Также, некоторые почтовые провайдеры (гугл например) пишут строку без переносов, вот так:
> sed 's/ from.*])//;s/with ESMTP //;s/ for .*;/;/'Спасибо за оказанную помощь!
Но мне надо было готовое решение в виде файла /etc/postfix/header_checks
а чтобы перевести ваш пример в удобоваримый файл для postfix надо понимать смысл происходящего.
Так что для меня сейчас самое лучшее - это учебник "Форта Б. Регулярные выражения. 10 минут на урок "
Но все равно, спасибо!
> snd1.poleznyisovet.ru. 60 IN
> MX 10 snd1.poleznyisovet.ru.
> poleznyisovet.ru. 60
> IN MX
> 10 mx.poleznyisovet.ru.
> не совсем понял с какого домена через какой мх ходит - проверить
> на всякий ...Для меня остается тайной за семью печатями, откуда вы взяли домен poleznyisovet.ru, ведь я не публиковал его...
> а так читаДь туД: видимо:
> https://www.opennet.ru/openforum/vsluhforumID1/82162.htmlВ приведенном примере применяется IGNORE , то есть удаляется вся строка, а мне надо удалить часть строки, REPLACE
> По поводу нехватки знаний: как я понимаю постфикс понимает PCRE, потратьте 45
> минут жизни и изучите их. Поверьте, они того стоят. Просто поверьте.
> Да и вообще понять что такое регекспы не сложно и не
> долго.мой постфикс собран без поддержки PCRE. А что касается повышения знаний, так согласен с этим полностью.
Специалисты по регуляркам, пожалуста отзовитесь!
Скачал вышеуказанные учебники. Изучаю вторые сутки. Больше всех понравился учебник "Форта Б. Регулярные выражения. 10 минут на урок "
Стал что то понимать.
Я понял как найти по определенному шаблону (регулярке) определенный(е) слова/куски текста. Одно никак в мою голову не влезает. Это касается именно использования REPLACE в файле regexp:/etc/postfix/header_checks. Ведь в PHP вроде как понятно, функция preg_replace() находит и заменяет необходимые куски текста и возвращает первоначальный текст с измененными участками.
Однако в случае с postfix совершенно другое дело. Здесь не возвращается первоначальный текст, а его надо явно указывать.
Например, мой случай, расписанный вначале этого топика. Одна длинная строка содержит внутри себя три участка, которые необходимо заменить/удалить и при том, чтобы оставшиеся участки остались без изменения.
Как это осуществить в такой конструкции: ???
ххххх REPLACE ххххх
Уже башку сломал.или другими словами: Как после слова REPLACE указать те куски текста, которые не надо изменять?
Вот вытащил из интернета пример/Message-Id:\s+<(.*?)@hostname>/ REPLACE Message-Id: <$1@domain.tld>
Здесь та часть, котрую не надо изменять обозначена $1
Где найти информацию о том, как сформировать эту самую $1 ?
> Где найти информацию о том, как сформировать эту самую $1 ?ты, что? стебаешься? не надо, это не хорошо
тебе же привели пример
>> Где найти информацию о том, как сформировать эту самую $1 ?
> ты, что? стебаешься? не надо, это не хорошо
> тебе же привели примерЕсть люди, которые возомнили из себя седьмое чудо света и их нос выше останкинской телевышки. А есть люди простые, которые просто подскажут: "Дорогой, ищи информацию как сделать ссылки и внутренние переменные". Так поднимем бокалы за простых людей!!!
> Так поднимем бокалыалкоголь - яд
мозг атрофируется
>> Так поднимем бокалы
> алкоголь - яд
> мозг атрофируетсяа где было сказано, что в бокалах алкоголь????
На воре шапка горит!!!!
> На воре шапка горит!!!!нет. я не пью
Какой чудесный учебник "Форта Б. Регулярные выражения. 10 минут на урок"
До того, увидев регулярки у меня портилось настроение, а сейчас, с прочтением каждой страницы мне все больше и больше нравятся эти регулярные выражения.
> Какой чудесный учебник "Форта Б. Регулярные выражения. 10 минут на урок"
> До того, увидев регулярки у меня портилось настроение, а сейчас, с прочтением
> каждой страницы мне все больше и больше нравятся эти регулярные выражения.молодец
клеточки серого вещества твоего головного мозга начинают работать
>> snd1.poleznyisovet.ru. 60 IN
>> MX 10 snd1.poleznyisovet.ru.
>> poleznyisovet.ru. 60
>> IN MX
>> 10 mx.poleznyisovet.ru.
>> не совсем понял с какого домена через какой мх ходит - проверить
>> на всякий ...
> Для меня остается тайной за семью печатями, откуда вы взяли домен poleznyisovet.ru,
> ведь я не публиковал его...Ок. Воскресенье, я пьяный и добрый ... меня всегда смешило когда люди говоря про реверсы DNS, скрывают один октет.
Следите за руками ...
1) IP почтовика был засвечен без одного октета 95.ххх.224.235, т.е. сервак один из 255 вариантов, и самое главное уникальная часть доменного имени snd1.mysite.ru. Далее все элементарно ... если вы не совсем ламер, должен быть такой же реверс, ибо таки почтовик.
2) Открываем ексель (проклятый микрософтовский софт), пишем в первой строке 1, во второй пишем =А1+1. Растягиваем до 255 строки и получаем последовательность ячеек со значениями 1-255.
3) Копируем столбец и вставляем в мой любимый notepad++ (и вот тут собственно то, зачем я начал продолжил топ, он умеет PCRE!). Жмем Ctrl+H и забиваем в первую строку
"(.*)", а во вторую "host 95.\1.224.235" (домашнее задание объяснить зачем в первом выражении скобки).
4) Копипастим полученный текст в файл через консоль сервака скажем scr.sh, читаем заклинания chmod 700 scr.sh, scr.sh > res, grep snd1 res.
5) Вывод дал только одно совпадение - профит!
На все про все - полторы минуты, дольше всего ждать пока скрипт из 255 запросов будет тупить по таймауту на несуществующих записях.
Это не фокус - это просто.
Слишком сложно.
Вот однострок
for i in {1..255}; do host 95.${i}.224.235; done | grep snd1
> Слишком сложно.
> Вот однострок
> for i in {1..255}; do host 95.${i}.224.235; done | grep snd1урок был несколько другого уровня :)
>> Слишком сложно.
>> Вот однострок
>> for i in {1..255}; do host 95.${i}.224.235; done | grep snd1
> урок был несколько другого уровня :)Тогда почему в алгоритме отсутствуют установка виндузей, офиса, нотепадплюсплюса и пр.?
>[оверквотинг удален]
> собственно то, зачем я начал продолжил топ, он умеет PCRE!). Жмем
> Ctrl+H и забиваем в первую строку
> "(.*)", а во вторую "host 95.\1.224.235" (домашнее задание объяснить зачем в первом
> выражении скобки).
> 4) Копипастим полученный текст в файл через консоль сервака скажем scr.sh, читаем
> заклинания chmod 700 scr.sh, scr.sh > res, grep snd1 res.
> 5) Вывод дал только одно совпадение - профит!
> На все про все - полторы минуты, дольше всего ждать пока скрипт
> из 255 запросов будет тупить по таймауту на несуществующих записях.
> Это не фокус - это просто.Понял! Спасибо за предоставленный урок.
Проделывать все это я не буду, потому что мне это не надо, но смысл я понял.
Что касается вопроса "зачем в первом выражении скобки", то после прочтения учебника горизонты моих познаний в регулярных выражениях расширились и могу предположить, что скобки - это выражение или подвыражение, на которое потом можно ставить ссылку, как на переменную.
> Понял! Спасибо за предоставленный урок.
> Проделывать все это я не буду, потому что мне это не надо,
> но смысл я понял.
> Что касается вопроса "зачем в первом выражении скобки", то после прочтения учебника
> горизонты моих познаний в регулярных выражениях расширились и могу предположить, что
> скобки - это выражение или подвыражение, на которое потом можно ставить
> ссылку, как на переменную.Самое главное что умеете читать. А то судя по последним тенденциям многи это так и не могут осилить.
ПыСы: что-что, а что почитать тут всегда подскажут :)
Тут по ходу дела возник один вопрос.
Буду благодарен за подсказку.
Правильно или нет, но я сам написал регулярку для замены заголовка письма в postfix, которую сам обозначил вначале этого топика и она работает. Вот она:/^Received: from (.*)\)(\r|\r\n)*\s+(by (.*)\)) (.*)\s(id \w+)(\r|\r\n)*\s+(.*);(.*)/ REPLACE Received: $3 ${6};${9}
В результате я получаю одну строку:Received: by mx.mysite.ru (Postfix, from userid 0) id 9095FC0240; Sat, 22 Oct 2016 14:56:23 +0300 (MSK)
вопрос.
как сделать, то есть что писать после слова REPLACE Received: чтобы получаемое выражение имело перенос строки:Received: by mx.mysite.ru (Postfix, from userid 0)
id 9095FC0240; Sat, 22 Oct 2016 14:56:23 +0300 (MSK)
пытался вставлять между $3 ${6} \n, "\n", но это не помогает, а просто печатает как есть.
Может так:
/^Received: from .*\s+(by (.*)\)) (.*)\s(id \w+).*\s+(.*);(.*)/m REPLACE Received: $3 ${6};${9}