Пользователь
0,0
рейтинг
3 марта 2011 в 18:33

Администрирование → Массовая почтовая рассылка через Exim или как не попасть в спам из песочницы

Жизнь была прекрасна и все было в этом мире хорошо, пока почта с моего сайта не стала активно посылаться в спам практически всеми крупными почтовыми серверами. Особенно усердствовал в этом Gmail. Частенько меня принимали за спамера в Yandex, реже в mail.ru и rambler.
image
Исходя из совокупности представленных факторов стало понятно, что надо что-то делать с настройками своего почтового сервера Exim. Посмотреть, как это было сделано, приглашаю под хабракат.


Порывшись немного в интернете на эту тему, обнаружил несколько интересных статей на Хабре (Почтовая кухня #1: DNS, Что такое SPF, Как не стать спамером со своей уютной рассылочкой), но они, к сожалению, охватывают только часть настроек почтового сервера. Постараюсь восполнить этот пробел.

Итак имеется debian lenny сервер и установленный на нем дефолтный Exim 4.72. Описывать установку Exim не имеет смысла (хотя тут ничего сложного нет — sudo apt-get install exim4). Лишь напомню, что первоначальную настройку exim можно провести следующей командой:

dpkg-reconfigure exim4-config

Все! Сайт готов рассылать почту. Но здесь есть 3 «но». Почтовики очень любят SPF, PTR и DKIM и очень не любят их отсутствие. Далее описывается как настроить это буквально за несколько минут.

PTR



Сначала настроим PTR. PTR это так называемая «обратная запись». В ней в обратном порядке записывается IP адрес хоста, с которого в нашем случае рассылается почта. По этой записи почтовики распознают имя хоста по его IP. Немного теории здесь.

Предположим, что IP вашего почтового сервера 78.56.158.23. Открываем наш NS сервер (или, что чаще настройки провайдера сервера или хостера) и добавляем следующую DNS запись (IP при этом «разворачиваем»):

23.158.56.78.in-addr.arpa IN PTR mail.mydomain.ru.

Проверяем изменения — http://centralops.net/co/DomainDossier.aspx
Здесь остается добавить, что такая запись у моего хостера FastVPS задается через панель веб-ребута.

SPF



В SPF записи мы указываем какие сервера имеют право отправлять почту с вашего домена. В самом простом случае эта запись выглядит следующим образом:

mydomain.ru. IN TXT "v=spf1 a mx ~all"
или/и (если NS позволяет создавать SPF записи)
mydomain.ru. IN SPF "v=spf1 a mx ~all"

Т.е. отправлять почту имеют право сервер с DNS записью в секции «a» и почтовый сервер в секции «mx».
Более подробно о SPF написано в статье "Что такое SPF".

Составить свой вариант записи SPF поможет этот сервис — openspf.org

Опять проверяем результат через сервис centralops.net.

DKIM



Для создания успешной рассылки осталось создать подписи к письмам.

Устанавливаем dkim-filter:

apt-get install dkim-filter

Затем генерируем пару ключей для подписи писем (открытый и закрытый ключ):

dkim-genkey -d mydomain.ru -s mail -r

-r значит, что ключ будет использоваться только для почты
-s задает имя dkim-selector (можно указать любое имя, например имя вашего домена)

Смотрим, что получилось при генерации открытого ключа:

tail mail.txt
И видим:
mail._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCS..." ; ----- DKIM mail for mydomain.ru

Сам ключ обрезал, потому что он довольно длинный.

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

У нас остался закрытый ключ mail.private, который нам надо привязать к Exim.
Переименовываем mail.private и копируем его в директорию exim:

mv mail.private mydomain.ru.key
cp mydomain.ru.key /etc/exim4
chmod 755 /etc/exim4/mydomain.ru.key


или же лучше сделать хозяином файла пользователя exim командой chown и сделать права на доступ к нему, к примеру, 600 или еще строже 400:

chown exim:exim /etc/exim4/mydomain.ru.key
chmod 600 /etc/exim4/mydomain.ru.key


И теперь осталось настроить сам Exim:

nano /etc/exim4/exim4.conf.template

Находим секцию remote_smtp и перед ней добавляем:

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim4/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}


И немного правим саму секцию:

remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = mail
dkim_private_key = DKIM_PRIVATE_KEY


где dkim_selector это первое слово перед ._domainkey в открытом ключе

После перезапускаем exim:

/etc/init.d/exim4 restart

Теперь проверим подписи. Для этого можно просто отправить письмо на любой адрес Gmail. Затем надо посмотреть подробные сведения о письме и в поле «Подписан» должен быть ваш домен. Или можно посмотреть код письма и в заголовке письма должно присутствовать поле DKIM-Signature. Если оно есть, то мои поздравления! Подписи работают!

Итоги



Вот таких трех простых шагов достаточно, чтобы ваша почта больше не попадала в спам (если вы конечно не спамер). У меня, например, до этих переделок почта с сайта практически всегда отправлялась Gmail в спам. Теперь же надо что-то невообразимое написать в письме, чтобы оно было помечено как спам. К счастью, все мои рассылки теперь доходят до адресатов.

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

В Exim по умолчанию включена система автоповторов для всех хостов. Вы можете усовершенствовать дефолтное правило, найдя в конфигурационном файле секцию RETRY CONFIGURATION и отредактировать согласно этой инструкции.

В рамках данного топика не рассматривалось применение описанных технологий для приема писем на свой почтовый сервер. Это тема для другой статьи.

Ссылки:
Рекомендации по осуществлению массовых рассылок
Почтовая кухня #1: DNS
HOWTO: Exim & DKIM
@bigsan
карма
18,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (41)

  • +1
    Весьма актуально для меня, к сожалению. Послужило причиной для переезда на выделенный сервер. Спасибо за статью
    • +1
      У меня тоже была свистопляска с хостингами. Особенно весело было, когда на том же почтовом серваке, через который я слал почту, появлялся настоящий спамер. Вот тут-то начиналась переписка со службой поддержки хостинга :)
      • 0
        Круче, когда Мастерхост забанил сеть региональных новостных сайтов ИА и клиента перестали получать свои новости, за которые еще и заплатили кучу денег.
        Мгновенный переезд 24 немаленьких сайтов на другой хостинг — это по круче секса с 24 девушками.
  • +3
    PTR чаще всего добавляет провайдер, а не вы — это раз. Без PTR вообще почтовый сервер работать не должен — это два. Тут не рассылки, Exim или ещё что-то, а просто основы функционирования DNS.

    А три — это вот это:
    habrahabr.ru/blogs/linux/101628/
    • 0
      Отличная, кстати, статья у вас, спасибо.
    • 0
      Далеко не всегда PTR добавляет провайдер. Часто ручками его надо добавлять, как, например, в моем случае.
      И еще я черным по белому написал, что я не полноценный почтовый сервер настраивал. Нужна только рассылка.
      Ваша статья несколько вообще о другом. Основной уклон моей статьи это настройка Exim на совместную работу c DKIM. А PTR и SPF указаны для напоминания.
      • 0
        Если вы его ручками у себя наберёте — об этом кроме вас больше никто не узнает.
        • 0
          Ручками это делалось через провайдер моего сервера. Через ребут-панель фаствпс. NS сервер тоже позволял ввести PTR, но он извне не определялся. Честно я не особо разбирался в теории PTR — сделал и главное работает. Удивляет правда, что двумя комментами выше статью до конца не читают и пишут, что в ней только основы DNS.
      • 0
        PTR добавляется на DNS, которые обслуживают обратную зону для блока IP адресов. Очень редко к этому DNS есть доступ у пользователя. А статья моя в первую очередь акцентирует внимание на том, что для того, чтобы не попадать в спам, надо как минимум соответствовать общепринятым требованиям стандартов. В частности, наличие валидной PTR — одно из этих требований. DKIM, на самом деле, абсолютно не нужен для рассылок. Поставьте mailman, настройте почтовик по моей статье — и вы 100% не попадёте в спам, если, конечно, будете делать корректные рассылки. А когда вы начинаете рассылать с помощью непонятного софта кучу писем с сервера, у которого даже PTR не прописан — то результат предсказуем и совершенно ожидаем.
        • 0
          Я уже понял, что ваша статья гениальна. У меня тоже нет кучи непонятного софта — один Exim. Вполне себе понятная программа. Сгенерировать пару ключей можно и без дополнительных программ.
          В моем случае я имел возможность изменять PTR. И по умолчанию она была выключена.
          Без DKIM мои письма все равно через одно сыпались в спам. Сейчас все нормально.
          • 0
            Вот в том-то и проблема — что у вас. Вы пишите не сильно удосуживаясь разобраться в теоретических основах. Настраивать сервера по хавту не понимая, что делает каждая команда и каждая строчка конфига в хавту можно, но результат чаще всего будет именно такой, что каждое второе письмо будет попадать в спам. Поэтому всегда надо в первую очередь акцентировать на теории, а реализовать на практике теорминимум по настройке почтовика сможет любой.
            • 0
              Уже совсем непонятно, что вы хотите мне доказать. Как-то вы плавно перешли на обвинения, так и не указав, в чем же я не прав. Больше похоже на то, кто умнее. Я отлично понимаю, что делает каждая строчка в конфиге, которую я добавлял. И все письма идут как надо. И эти настройки будут работать нормально на всех серверах. А то, что вас так взволновал PTR, учитывая что статья только вскользь его затрагивает, мне вообще не понятно, опять же учитывая, что с PTR тоже нормально указана.
              • +3
                Да я ничего не хочу доказать! Я просто хотел обратить внимание, что ваш пост слишком конкретизирован, что возможно не есть хорошо, поскольку те, кто вдруг решат сделать также, как вы, обнаружат, что у них всё по другому.
                • 0
                  Возможно вы правы на счет конкретизации, т.к. пост писался на основе свежего опыта, которым я и решил поделиться. Только при написании я старался учитывать тот факт, что это должно быть универсальным решением для сервера с Exim. Если говорить о DKIM и SFP, то здесь все нормально. С PTR возможны подводные камни.
                  • +1
                    chmod 755 /etc/exim4/mydomain.ru.key

                    Приватный ключик 755? Шарман, шарман =)
                    • 0
                      Что здесь такого? Если владелец root, то это нормально. Для текстового файла лучше конечно 744. Если пользователь не root, то 444. Exim нужно как-то иметь доступ к этому ключику. Или chown exim:exim и тогда права вообще можно поставить 400 или 600. Последний вариант конечно более предпочтителен для безопасности.
                      Поправьте меня, если я не прав.
                      • +1
                        Последний вариант не более предпочтителен, а единственно возможен.

                        Если вы даёте на чтение приватный ключ любому пользователю системы, то ваша криптография оборачивается против вас. Как только я получаю ваш ключ, я смогу слать имперсонифицированный спам как бы от вашего сервера. И потом не отмажетесь — вот же вашим ключом подписано!

                        К.О.: верно для любых приватных ключей.
                        • +1
                          Спасибо, что обратили на это внимание. В процессе написания статьи упустил этот момент. Хотя настраивал именно по последнему варианту.
    • 0
      >> Без PTR вообще почтовый сервер работать не должен — это два.

      Как-то с удивлением обнаружил, что контора под названием Microsoft игнорирует это правило. :)
      Не знаю как сейчас, но еще полгода назад добавлял их в белый список, после того как мне пожаловались, что их письма reject'ятся.
  • 0
    Спасибо. Как раз вовремя, PTR и SPF я настроил изначально. Вот только для поддержки DKIM видимо надо обновлять exim, в версиях меньше 4.70 было как-то по-другому как я понял. Или это как раз для них?
    • 0
      У меня Exim 4.72. В более ранних версиях для добавления DKIM сам Exim надо было пересобирать. Статей про такую сборку довольно много в интернете. Самый простой выход — обновить Exim из репозитория. В моем случае я добавил реп Squeeze в дебиан.
  • 0
    В моем случае еще одна фишка была: локальный hostname должен соответствовать адресу, с которого идет почта, а иначе, насколько я помню, часть серверов из «серого списка» сообщения отказывалась выводить, т.к. exim hostname для чего-то там использовал и слал его в ответ.
    • 0
      Выше написал неправильно, hostname exim использует для формирования заголовка HELO, похоже.
      Короче, деталей там миллион, поэтому если на почту завязано что-то важное, то может иметь смысл почтовую рассылку отдать на сторону в MainChimp какой-нибудь. Но и там не все в порядке (хотя должно бы быть) — MainChimp, например, был в mail.ru забанен недавно (не знаю, как сейчас, решили ли вопрос).
  • +1
    коллеги, а как создать SPF запись, если основная почта бегает через yandex почту (корп.версия) и существует дополнительный сервер для рассылок?
    • 0
      SPF запись добавляется в ДНС. Видимо туда нужно добавить яндекс и дополнительный сервер для рассылок.
    • 0
      У вас в NS сервере mx почтового сервера же yandex прописаны. Создаете SPF на NS сервере также как написано в статье. Все там очень просто.
      • +1
        Коллеги, вы невнимательны.
        Я написал о том, что помимо SMTP серверов Yandex-a используется собственный сервер, исключительно для рассылок.

        Вариант «v=spf1 redirect=_spf.yandex.ru» не подходит, т.к. учитывает только сервера яндекса.

        Как правильно создать запись?
        • 0
          так?
          v=spf1 redirect=_spf.yandex.ru +a:server.dlya.rassilok
          • 0
            немного не так:
            v=spf1 include:_spf.yandex.ru +a:server.dlya.rassylok ~all
    • 0
      Поддерживаю вопрос только для google apps. Что из этого комплекта — SPF, DKIM, PTR необходимо по-минимуму и по-максимуму?
      Сколько ни было на хабре статей про гугль аппс из серии — а никто об этом даже не обмолвился.
      • +1
        Ставьте на всякий случай все. На производительность сервера это никак не влияет. Кроме того, все уважающие себя операторы почты свои письма подписывают и используют SPF. Про PTR в комметах написали, что он обязателен всегда. Была у меня где-то ссылка ненужная, как раз помощь по google apps. А вот она: Help
        Там рядышком найдете и все остальное, что вам нужно.
      • +1
        По поводу SPF для Google Apps в гугловой справке тоже есть инфструкции: www.google.com/support/a/bin/answer.py?answer=178723
  • 0
    Мы где-то год юзали аналогичное решение на постфиксе, но к сожалению это настолько неудобно менеджмить (отслеживать отлупы, прогнозировать нагрузку, очереди и т.д.), что долго зрела мысль как-то это все решить. В итоге купили умный MTA, который все делает за нас — название говорить не буду, но реально мощных продуктов на рынке всего два, но и стоят они как самолет.

    Когда было на постфиксе, руководствовался этими документами для настройки:
    Anti Spam Technical Alliance Technology And Policy Proposal
    MAAWG Sender Best Communications Practices
    • 0
      Могли бы PMнуть что за хвалёный почтовик вы купили?
      Актуален этот вопрос сейчас.
  • –7
    кг/am, автор даже не удосужился версию дебиана в статье упомянуть.
    • 0
      5.0.6 — это настолько важно? Можно и без выражений кг/am
      • 0
        Э… дошли тут руки протестировать статью в деле, а оказывается exim 4.72 — он совсем не стоковый, а из backports.
        • 0
          Я ставил эту версию из репозитория Squeeze. В Lenny были слишком старые программы.
  • 0
    Спасибо за статью, про DKIM не знал, буду гуглить…
  • +1
    В своё время у меня очень проглючил dkim-filter. Из-за чего переехал с него на opendkim.
    Да, кстате ещё в довес к DKIM подписям использую DomainKeys (dk-filter) — очень похожая штука от Яху.

    P.S.: Есть ещё SenderID записи (SPF2, как я понял — ноги у неё ростут от МелкоМягких).
    Зона ДНС у меня смотрится примерно так:
    $ORIGIN .
    $TTL 3600        ; 1 hour
    example.com                IN        SOA        ns03.domaincontrol.com. dns.jomax.net. (
                                   2011030301        ; Serial
                                   28800                ; Refresh
                                   7200                ; Retry (2 hours)
                                   604800                ; Expire
                                   86400                ; minimum (1 day)
                                   )
                                   NS ns03.domaincontrol.com.
                                   NS ns04.domaincontrol.com.
    $TTL 600        ; 10 minutes
                                   A        173.12.78.10
    $TTL 1800        ; 30 minutes
                                   ;;; SPF and ServerID Records ;;;
                                   TXT "v=spf1 a mx include:_spf.example.com ~all"
                                   TXT "spf2.0/pra a mx include:_sid.example.com ~all"
                                   ;;; MX Records ;;;
                                   MX 0 mail.example.com.
    
    
    ;;; Domain Records go here ;;;
    
    $ORIGIN example.com.
    $TTL 3600                ; 1 hour
    
    ;;; DKIM/Domainkeys Signatures and Settings ;;;
    _domainkey                      TXT "o=-;"
    _adsp._domainkey                TXT "dkim=all"
    mail._domainkey                TXT "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHZXohph2LWJu605ONfejTXhRYAhyNfIM7YE2ypnRLRlYuDgLShqysAz2QwCWxwM1CmhA7XcrVTNjjc88qwBZ9lzjyPcZBGxRsN0hcISSvtQwkdERFVNghKD+uRPJG+bPh5o7ujLF6rHW969UX6PHPR9igGALsHZR7xrdVekP/iwIDAQAB"
    
    
    ;;; SPF and SenderID includes ;;;
    _spf                            TXT     "v=spf1 ip4:21.3.19.46 ip4:173.12.78.82"
    _sid                            TXT     "spf2.0/pra ip4:21.3.19.46 ip4:173.12.78.82"
    
    ;;; Servers and services
    localhost                        A        127.0.0.1
    mail                                A       28.6.70.6
    m1                                A        173.12.78.82
    m2                                A        173.12.78.83                                
    m3                                A        21.3.19.46
    
    www                                CNAME        example.com.
    
    ;;; Other records go here
    


    Про всевозможные значения для DKIM/Domainkeys читаем на буржуйском тут: www.zytrax.com/books/dns/ch9/dkim.html

  • 0
    Ох уж эти рассылки. За пост спасибо, поставил плюсик.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.