Зміст

MTA

Postfix

В отлиие от sendmail, Postfix умеет хранить входящую почту в папках формата Maildir. Это может быть полезным для установки веб-интерфейса к почтовому серверу без вспомогательного IMAP-сервера.

http://www.postfix.org/features.html

Ограничение скорости отправки писем

Антиспам-системы многих сервисов проводят контроль скорости отправки электронной почты. Поэтому когда Postfix отправляет письма “слишком быстро”, его могут заблокировать из-за подозрения в рассылке спама. Чтобы этого избежать, нужно установить следующие ограничения в файле настроек

'/etc/postfix/main.cf'
...
#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.cf1):

"/etc/postfix/main.cf"
transport_maps = hash:/home/user/mytransports

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

"/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:

"/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: приведён ниже:

"/home/user/from-filter1.sh"
#!/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

SASL-аутентификация

Для того, чтобы Postfix принимал письма для дальнейшей пересылки с других компьютеров (например, с нашего же домашнего почтового клиента), нужно обеспечить аутентификацию пользователей, так как без неё он будет либо принимать письма ото всех подряд, либо ни от кого.

Инструкция по настройке SASL-аутентификации находится здесь: http://www.postfix.org/SASL_README.html

Сначала надо проверить, какие реализации SASL поддерживает Postfix в нашей системе:

sudo postconf -a
cyrus
dovecot

Видим, что их две: cyrus и dovecot. Далее будем рассматривать вариант с cyrus.

Установим необходимые библиотеки и инструменты. В Debian это:

sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin libsasl2-modules-db

Запустим службу аутентификации и проверим на подлинность какого-либо пользователя, имеющегося в системе:

sudo systemctl -l restart saslauthd
sudo testsaslauthd -u username -p password
0: OK "Success."

Если видим надпись OK “Success.”, значит, служба запущена, отвечает на запросы и выполняет проверки.

Далее нужно внести изменения в настройки самого Postfix:

/etc/postfix/main.cf
smtp_tls_security_level = may
smtp_tls_cert_file = /etc/ssl/certs/mymailserver.cert
smtp_tls_key_file = /etc/ssl/private/mymailserve.key
smtp_tls_note_starttls_offer = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/ssl/certs/mymailserver.cert
smtpd_tls_key_file = /etc/ssl/private/mymailserver.key
 
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noplaintext, noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sender_login_maps = hash:/etc/postfix/controlled_envelope_senders
smtpd_relay_restrictions = permit_mynetworks,
                           reject_sender_login_mismatch, 
                           permit_sasl_authenticated, 
                           defer_unauth_destination

Если мы хотим проверять подлинность пользователей, указанных в базе данных /etc/sasldb2, в файле /etc/postfix/sasl/smtpd.con указываем метод auxprop с плагином sasldb:

/etc/postfix/sasl/smtpd.conf
#pwcheck_method: saslauthd
#mech_list: PLAIN LOGIN
 
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

Редактировать базу данных /etc/sasldb2 можно при помощи команды saslpasswd2:

sudo saslpasswd2 -c -u mydomain.com username

Просмотреть список всех пользователей в базе можно командой:

sudo sasldblistusers2

Далее необходимо обеспечить доступ Postfix к этой базе для проверки. Для этого нужно сменить группу -владельца этого файла и добавим Postfix в эту группу:

sudo chown :sasl /etc/sasldb2
sudo usermod -a -G sasl postfix
Важно заметить, что именем пользователя при такой проверке является полное выражение вида username@mydomain.com, а не просто username.

Далее, мы, вероятно, хотим, чтобы Postfix не позволял пользователям (даже зарегистрированным) указывать посторонние адреса в поле From: отправляемых писем. Для этого мы ограничим возможности пользователя в указании своего адреса, и укажем, кто каким адресом имеет право пользоваться.

В конфигурации Postfix этому соответствуют параметр reject_sender_login_mismatch и путь к файлу-таблице, содержащему соответствие пользователей и адресов smtpd_sender_login_maps. В этот файл нужно внести в первую колонку - адрес пользователя, указанный им в письме, а во вторую колонку – имя этого пользователя в базе SASL:

/etc/postfix/controlled_envelope_senders
# envelope sender           owners (SASL login names)
john@example.com            john@example.com
helpdesk@example.com        john@example.com, mary@example.com
postmaster                  admin@example.com
@example.net                barney, fred, john@example.com, mary@example.com

Далее нужно преобразовать эту таблицу из простого текстового файла в базу данных:

cd /etc/postfix/
sudo postmap controlled_envelope_senders

И наконец, можно перезапустить Postfix с новыми настройками и посмотреть, что вышло:

sudo postfix reload

Теперь можно проверить, принимает ли сервер подключения и предоставляет возможности SSL-аутентификации 2)

telnet  server.example.com 25
...
220 server.example.com ESMTP Postfix
EHLO client.example.com
250-server.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH DIGEST-MD5 PLAIN CRAM-MD5
250 8BITMIME
AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
235 Authentication successful

Причём эти строки вводятся со стороны клиента:

EHLO client.example.com
AUTH PLAIN AHRlc3QAdGVzdHBhc3M=

Если сервер отвечает на указанном порту и показывает доступные методы аутентификации, значит, всё настроено правильно.

Фильтрация спама

Для осуществления фильтрации почты можно установить программу Maildrop.

Фильтры этой программы настраиваются в файле /etc/courier/maildroprc. Например:

"/etc/courier/maildroprc"
if (/^X-Spam-Status:.*YES.*/)
{
  exception {
    to "Maildir/.SPAM/"
  }
}

Такой фильтр будет доставлять все письма, в заголовке которых поле X-Spam-Status: содержит слово “YES”, в подпапку SPAM в почтовом каталоге пользователя. Такой заголовок письма может выставлять какая-либо служба проверки почты. Например, SpamAssassin.

Для того, чтобы почтовый сервер Postfix пропускал все письма через фильтры Maildrop, нужно внести следующие изменения в конфигурацию Postfix3):

"/etc/postfix/main.cf"
    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
"/etc/postfix/virtual_mailbox"
    user1@some.domain        ...text here does not matter...
    user2@some.domain        ...text here does not matter...
    user3@someother.domain   ...text here does not matter...
"/etc/postfix/virtual_alias"
    postmaster@some.domain           postmaster
    postmaster@someother.domain      postmaster
"/etc/postfix/master.cf"
maildrop  unix  -       n       n       -       -       pipe
      flags=ODRhu user=vmail argv=/path/to/maildrop -d ${recipient}

Если же требуется всего лишь фильтрация писем, доставляемых в папки локальных пользователей (у которых есть учётная запись в операционной системе), можно не изменять конфигурации Postfix, а просто записать в файл ~/.forward такую строку (включая кавычки!):

"~/.forward"
"|/usr/bin/maildrop -d ${USER}"

SpamAssassin

Установка

В Debian GNU/Linux нужно установить пакеты spamassassin и spamc.

Настройка

Чтобы письма, доставляемые в папки локальных пользователей дополнительно проходили проверку службой SpamAssassin, файл ~/.forward должен иметь следующее содержание:

"~/.forward"
"|/usr/bin/spamc|/usr/bin/maildrop -d ${USER}"

Если spamc будет выдавать в логи такую ошибку:

spamc[17863]: connect to spamd on ::1 failed, retrying (#1 of 3): Connection refused

то устранить её можно, создав следующий файл4):

/etc/mail/spamassassin/spamc.conf
-d 127.0.0.1

Фильтр исходящей почты

http://www.postfix.org/FILTER_README.html

IMAP

http://wiki2.dovecot.org/

http://wiki2.dovecot.org/QuickConfiguration

http://www.brennan.id.au/12-Sendmail_Server.html

Web-интерфейс

http://www.squirrelmail.org/about/

SqWebmail

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

SPF

http://www.openspf.org/

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

https://wiki.debian.org/Postfix

http://www.postfix.org/documentation.html

Greylisting

http://www.ukr.net/mta/std3.html

https://www.fsf.org/about/systems/greylisting

2)
пример взят отсюда: http://www.postfix.org/SASL_README.html#server_test