Це стара версія документу!
В отлиие от sendmail, Postfix умеет хранить входящую почту в папках формата Maildir. Это может быть полезным для установки веб-интерфейса к почтовому серверу без вспомогательного IMAP-сервера.
Антиспам-системы многих сервисов проводят контроль скорости отправки электронной почты. Поэтому когда Postfix отправляет письма “слишком быстро”, его могут заблокировать из-за подозрения в рассылке спама. Чтобы этого избежать, нужно установить следующие ограничения в файле настроек
... #default_destination_concurrency_limit=2 #default_destination_rate_delay=1m #default_destination_concurrency_limit=2 #mlmmj_destination_rate_delay=0s smtp_destination_concurrency_limit=2 smtp_destination_rate_delay=10m
sudo postqueue -p
sudo postsuper -d 95E0AA21E68
где 95E0AA21E68
– это уникальный номер письма в очереди (показывается командой postqueue -p
)
Для удаления всех писем в очереди можно задать команду:
sudo postsuper -d ALL
Для удаления только отложенных писем из очереди:
sudo postsuper -d ALL deferred
В файле конфигурации Postfix /etc/postfix/master.cf
перечислен список и параметры так называемых “транспортов” для сообщений разного типа. В этот список можно добавить и свой собственный транспорт. Рассмотрим на примере обычного bash-скрипта, который будет изменять заголовок письма From:
.
Сначала нужно указать Postfix расположение файла, в котором будут перечислены наши транспорты. Это указывается в файле /etc/postfix/main.cf
1):
transport_maps = hash:/home/user/mytransports
Теперь нужно создать собственно сам файл с перечислением наших дополнительных транспортов. Его формат выглядит примерно так:
abonent1@server.com transport1:parameter1 abonent2@server.com transport1:parameter2 abonent3@server.com transport2:parameter1 abonent4@server.com discard abonent5@server.com transport1:parameter1
В этом файле указываетя, каким из транспортов доставлять письма, ПРИшедшие на тот или иной адрес нашего сервера. transport1
и transport2
здесь просто названия наших транспортов. Они могут быть любые, и цифры в них совсем не обязательны. parameter1
и parameter2
– это параметры, которые будут переданы нашему транспорту в виде аргумента. Как видно, они могут быть одинаковыми или разными для разных адресов – в зависимости от задачи. discard
здесь – один из встроенных транспортов Postfix, который попросту выбрасывает письмо и делает вид, что успешно его доставил. Т.е. все письма, приходящие в такой конфигурации на адрес abonent4@server.com
будут молча удаляться.
После создания или изменения этого файла, необходимо сконвертировать его в формат базы данных, которую сможет читать Postfix:
postmap mytransports
При этом появится (или обновится, если уже был) файл mytransports.db
.
Теперь, когда мы придумали название транспорта и указали, какие письма через него нужно проводить, нужно описать этот транспорт в файле /etc/postfix/master.cf
:
transport1 unix - n n - - pipe flags=ORhu user=myuser argv=/home/user/from-filter1.sh $nexthop transport2 unix - n n - - pipe flags=ORhu user=myuser argv=/home/user/from-filter2.sh $nexthop
Здесь названия транспортов transport1
и transport2
должны точно совпадать с теми, которые мы описали в файле транспортов /home/user/mytransports
, имя пользователя myuser
– это системный пользователь, от имени которого будет запущен скрипт /home/user/from-filter1.sh
. Переменная nexthop
хранит значение того параметра, который мы указывали в нашем файле транспортов (parameter1
, parameter2
и т.п.). Поскольку тип транспорта здесь указан как pipe
, письмо будет передано нашему скрипту в стандартный ввод. И обрабатывать его в теле скрипта нужно с учётом этого.
Пример такого скрипта, который заменяет поле From:
приведён ниже:
#!/bin/bash NEXTHOP=$@ TEMPFILE=`tempfile` # Если передан параметр "parameter1" # (что соответствует в нашем примере письмам, пришедшним НА адреса # abonent1@server.com и abonent5@server.com if [ $NEXTHOP == "parameter1" ] then while IFS= read -r LINE; do if [[ $LINE == From:* ]] then # Заменим строку отправителя так, чтобы его адрес был <parameter1@server.com> printf '%s\n' "$LINE" | sed -e 's/"//g' | sed -e 's/^From: \(.*\)/From: "\1" <parameter1@server.com>/' >> ${TEMPFILE} else printf '%s\n' "$LINE" >> ${TEMPFILE} fi done # Если передан параметр "parameter2" # (что соответствует в нашем примере письмам, пришедшним НА адрес # abonent2@server.com elif [ $NEXTHOP == "parameter2" ] then while IFS= read -r LINE; do if [[ $LINE == From:* ]] then # Заменим строку отправителя так, чтобы его адрес был <parameter2@server.com> printf '%s\n' "$LINE" | sed -e 's/"//g' | sed -e 's/^From: \(.*\)/From: "\1" <parameter2@server.com>/' >> ${TEMPFILE} else printf '%s\n' "$LINE" >> ${TEMPFILE} fi done # Во всех остальных случаях просто скопируем письмо без изменений во временный файл else cat - > ${TEMPFILE} fi # Здесь любое действие с полученным и обработанным письмом # Например, передача его в один из списков рассылки mlmmj: cat ${TEMPFILE} | /usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$NEXTHOP rm ${TEMPFILE}
Разумеется, права на запуск этого скрипта должны быть у системного пользователя myuser
, которого мы указали в файле /etc/postfix/master.cf
выше.
После всех этих манипуляций с транспортами, нужно перезагрузить конфигурацию Postfix:
sudo /etc/init.d/postfix reload
Для осуществления фильтрации почты можно установить программу Maildrop.
Фильтры этой программы настраиваются в файле /etc/courier/maildroprc
. Например:
if (/^X-Spam-Status:.*YES.*/) { exception { to "Maildir/.SPAM/" } }
Такой фильтр будет доставлять все письма, в заголовке которых поле X-Spam-Status:
содержит слово “YES
”, в подпапку SPAM
в почтовом каталоге пользователя. Такой заголовок письма может выставлять какая-либо служба проверки почты. Например, SpamAssassin.
Для того, чтобы почтовый сервер Postfix пропускал все письма через фильтры Maildrop, нужно внести следующие изменения в конфигурацию Postfix2):
maildrop_destination_recipient_limit = 1 virtual_mailbox_domains = some.domain someother.domain virtual_transport = maildrop virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox virtual_alias_maps = hash:/etc/postfix/virtual_alias
user1@some.domain ...text here does not matter... user2@some.domain ...text here does not matter... user3@someother.domain ...text here does not matter...
postmaster@some.domain postmaster postmaster@someother.domain postmaster
maildrop unix - n n - - pipe flags=ODRhu user=vmail argv=/path/to/maildrop -d ${recipient}
Если же требуется всего лишь фильтрация писем, доставляемых в папки локальных пользователей (у которых есть учётная запись в операционной системе), можно не изменять конфигурации Postfix, а просто записать в файл ~/.forward
такую строку (включая кавычки!):
"|/usr/bin/maildrop -d ${USER}"
В Debian GNU/Linux нужно установить пакеты spamassassin и spamc.
Чтобы письма, доставляемые в папки локальных пользователей дополнительно проходили проверку службой SpamAssassin, файл ~/.forward
должен иметь следующее содержание:
"|/usr/bin/spamc|/usr/bin/maildrop -d ${USER}"
http://www.courier-mta.org/sqwebmail/
https://lists.debian.org/debian-user/2002/11/msg03898.html
cd /srv/www/cgi-bin/ ln -s /usr/lib/cgi-bin/sqwebmail cd /srv/www ln -s /usr/share/sqwebmail
http://www.openspf.org/FAQ/Common_mistakes
http://serverfault.com/questions/369460/what-are-spf-records-and-how-do-i-configure-them
http://xmodulo.com/mail-server-ubuntu-debian.html
https://www.linode.com/docs/email/running-a-mail-server