Postfix. Фильтрация входящих сообщений

Thank you for reading this post, don't forget to subscribe!

Конфигурация Postfix

В фай­ле master.cf опи­са­ны сер­ви­сы при­ни­ма­ю­щие уча­стие в достав­ке сооб­ще­ний. Созда­дим свой сер­вис myhook и при­це­пим к нему наш скрипт postfix.php

Теперь при­ни­ма­ю­ще­му сер­ви­су smtp нуж­но объ­яс­нить, чтоб всю вхо­дя­щ­юю почту он про­пус­кал через наш скрипт postfix.php

Если есть необ­хо­ди­мость филь­тро­вать почту с localhost’а, то выше­ска­зан­ное необ­хо­ди­мо сде­лать и для сер­ви­са pickup

После вне­се­ния изме­не­ний пере­чи­та­ем кон­фи­ги postfix’а

Фильтр

В пап­ке /path/to/ созда­дим файл postfix.php и дадим ему пра­ва 755 (испол­ня­е­мый для всех, изме­не­ния толь­ко владельцу)

Дан­ный скрипт дол­жен запи­сать стро­ку «Script successfully ran at ….» в файл postfixtest. Пред­по­ла­га­ет­ся, что /usr/bin/php — это путь к PHP CLI

Тесто­вый запуск с пра­ва­ми поль­зо­ва­те­ля www-data

Если в postfixtest появи­лась стро­ка «Script successfully ran at ….», тогда про­бу­ем слать почту. Почту адре­сат не полу­чит, но на дан­ном эта­пе важ­но добить­ся, чтоб отра­бо­тал postfix.php. В любом слу­чае смот­рим логи /var/log/mail.log

Теперь слег­ка услож­ним наш скрипт. В резуль­та­те вхо­дя­щее сооб­ще­ние ока­зы­ва­ет­ся в фай­ле postfixtest и с его содер­жи­мым мож­но работать

И что дальше?

Понят­но, что исхо­дя из теку­щих настро­ек postfix’а дан­ный скрипт отра­ба­ты­ва­ет все­гда, неза­ви­си­мо от того, кто будет полу­ча­те­лем, даже если полу­ча­те­ля не сущетву­ет. Это хоро­шо для ака­де­ми­че­ско­го при­ме­ра, но абсо­лют­но не при­ем­ли­мо для продакшена

Фильтруем конкретного пользователя

Вот более реаль­ный при­мер: филь­тро­вать вхо­дя­щие для полу­ча­те­ля me@mydomain.tld и про­пус­кать осталь­ных. Для это­го созда­дим файл access и напи­шем следующее

Созда­ем хеши­ро­ва­ный файл access. На выхо­де полу­ча­ем access.db с кото­рым и будет рабо­тать postfix

И послед­ний штрих в main.cf. В дирек­ти­ве smtpd_recipient_restrictions (если нет, то создать) ука­зы­ва­ем postfix’у про­пус­кать все вхо­дя­щие через access. И если в заго­лов­ке To: будет най­ден me@mydomain.tld, то про­гнать его через фильтр myhook:dummy

Пере­чи­тать конфиги

Procmail

Procmail чита­ет из сво­е­го стан­дарт­но­го вхо­да. Он про­ве­ря­ет кон­фи­гу­ра­ци­он­ный файл .procmailrc, кото­рый дол­жен нахо­дить­ся в ката­ло­ге HOME поль­зо­ва­те­ля (procmail не рабо­та­ет в вир­ту­аль­ны­ми поль­зо­ва­те­ля­ми). В этом фай­ле опре­де­ля­ют­ся неко­то­рые пра­ви­ла, кото­рые ука­зы­ва­ют procmail, какие дей­ствия надо пред­при­нять после полу­че­ния сообщения

В кон­тек­сте дан­но­го поста все пись­ма при­хо­дя­щие на me@mydomain.tld скла­ды­ва­ют­ся в один файл mbox для даль­ней­шей обработки

Подключение procmail к postfix

В слу­чае с php нуж­но было редак­ти­ро­вать master.cf и main.cf. В слу­чае с procmail изме­не­ни­ям под­вер­га­ет­ся лишь main.cf  в кото­ром долж­на быть строка

Пере­чи­тать конфиги