Надсилання пошти є важливою опцією у веб-сервісах чи сайтах. Цю задачу можна вирішити різними способами, проте я розкажу, як налаштувати відправлення пошти з власного сервера, а також розкажу, як змусити ваші листи не потрапляти в спам, використовуючи захист PTR, SPF, DKIM та DMARC.
Припустимо, у нас є сервер, який має глобальну IP-адресу, і до цієї IP-адреси прикручений якийсь домен, наприклад, ssdev.pp.ua. В якості операційної системи у нас Debian Linux 8 Jessie. Тут і тут я описав, як його встановити та провести базові налаштування. В ролі поштового сервера будемо використовувати exim4, який зазвичай вже є в комплекті Debian. Всі операції виконуємо під root’ом.
Ця стаття не претендує на повне та ідеальне налаштування поштового сервера, проте цього буде цілком достатньо, щоб ваш сайт чи сервіс міг нормально надсилати пошту без використання сторонніх сервісів. Також зауважте, що ми налаштовуємо сервер лише на надсилання пошти, тобто приймати ми її не будемо, бо це значно складніше зробити, і для цього легше та краще використати готові сервіси, наприклад, google, yandex чи zoho (два останні безкоштовні). Про те, як приймати пошту на свій домен, використовуючи сторонній сервіс, я розкажу в майбутньому.
Щоб перевірити, чи exim4 є встановлений, виконаємо команду:
# dpkg -l | grep exim4
Якщо exim4 в результаті не буде, тоді встановимо його:
# aptitude update # aptitude install exim4
Тепер перевіримо, що команда sendmail посилається на exim4:
# stat /usr/sbin/sendmail
Якщо в результаті буде наступне:
File '/usr/sbin/sendmail' -> 'exim4'
значить все ОК, можна йти далі.
PTR
Перш ніж братися до налаштування exim4, потрібно розібратись з першим аспектом правильного налаштування поштового сервера — PTR.
Якщо коротко, то PTR — це такий DNS-запис, який власник IP-адреси прописує в reverse-зоні. Цей запис вказує, на який домен має посилатись та чи інша IP-адреса.
Щоб перевірити, чи IP вашого сервера має такий запис, виконайте команду host з параметром у вигляді IP-адреси вашого сервера:
# host 144.76.69.90
в результаті ми отримаємо PTR-запис:
90.69.76.144.in-addr.arpa domain name pointer ssdev.pp.ua.
Варто зауважити, що октети IP-адреси записані в зворотньому порядку. Цей запис говорить про те, що IP-адреса 144.76.69.90 відповідає домену ssdev.pp.ua.
Цей запис є дуже важливим для роботи поштових механізмів. Якщо ви будете надсилати пошту з сервера, в якого немає PTR-запису або ж він вказує на інший домен, то ваші листи в кращому випадку будуть потрапляти в спам.
Якщо такого запису немає, тоді вам потрібно звернутись до провайдера, що видав IP, з проханням додати цей запис.
Exim4
За замовчуванням exim4 працює лише локально, і для того щоб він міг надсилати пошту в інтернет, потрібно його налаштувати, запустивши команду:
# dpkg-reconfigure exim4-config
Пройдемось по параметрах, які треба налаштувати:
General type of mail configuration. Необхідно вказати тип конфігурації. В нашому випадку це буде internet site; mail is sent and received directly using SMTP.
System mail name. Тут треба вписати назву домену, на який резолвиться IP вашого сервера. Тобто це той самий домен, що прописаний в PTR. В моєму випадку це буде ssdev.pp.ua.
IP-addresses to listen on for incoming SMTP connections. Тут треба вказати IP, з яких можна підключитись до exim4 по SMTP-протоколу. В нашому випадку ми будемо використовувати поштовик лише в межах самого сервера, тому вказуємо 127.0.0.1, або 127.0.0.1 ; ::1, якщо на сервері використовується IPv6.
Other destinations for which mail is accepted. Тут треба вказати домени, для котрих даний сервер буде кінцевою точкою в маршруті, тобто мейли якого не потрібно пересилати на віддалені SMTP-сервера. В нашій ситуації потрібно ввести лише localhost, бо локальний домен більше немає кому обслуговувати. Нам непотрібно обслуговувати мейли для домену сервера, а якщо буде потрібно, то ми делегуємо цю роботу на сторонній поштовий сервер.
Domains to relay mail for. Тут вказуються домени, пошту яких ми можемо релеєти, тобто приймати, але не бути кінцевою точкою. Це має сенс, якщо наш сервер виступає в ролі резервного шлюзу для транспортування пошти стороннього домену. Оскільки нам це непотрібно, то залишаємо це поле порожнім.
Machines to relay mail for. Тут вказуються IP або діапазони IP, з яких дозволяється використовувати наш exim4, як релей для всіх доменів, не дивлячись на попередню опцію. Нам це непотрібно, тому залишаємо поле порожнім.
Keep number of DNS-queries minimal (Dial-on-Demand). З метою оптимізації при повільному підключенні до мережі пропонується зекономити на DNS-запитах. Оскільки сервери вже давно не працюють на повільних мережах (наприклад, Dial-Up), то обираємо No.
Delivery method for local mail. Оскільки exim4 буде обслуговувати локальну пошту, то її потрібно десь зберігати. Ми практично не використовуємо локальну пошту, тому обираємо значення за замовчуванням mbox format in /var/mail/.
Split configuration into small files. Конфігурацію exim4 можна тримати в одному великому файлі або в багатьох маленьких. Тут як кому зручно. Я зазвичай обираю No, щоб всі налаштування були в одному великому файлі.
Root and postmaster mail recipient. Ця опція з’являється незавжди. Тут потрібно вказати мейл, на який треба перенаправляти пошту, яка прийшла на ім’я системних користувачів root та postmaster. Тут можна вказати ім’я вашого юзера в системі або навіть ввести сторонній мейл. Можна вводити кілька значень розділяючи їх пробілом.
Якщо останньої опції не було, то її можна ввести вручну в файлі /etc/aliases. Синтаксис дуже простий:
root: igor postmaster: igor igor@ssdev.pp.ua
Перед двокрапкою пишемо ім’я юзера в системі, а після двокрапки — перелік імен системних юзерів та/або сторонніх мейлів, на які треба перенаправляти пошту, яка прийшла системному юзеру (що вказаний перед двокрапкою).
В роботі exim4 буде використовувати назву хоста та домен машини, наприклад dev.ssdev.pp.ua, що нам не дуже підходить, бо нам треба щоб використовувався лише домен ssdev.pp.ua. Тому давайте виправимо це і явно вкажемо, який хост треба використовувати при відправленні пошти:
# nano /etc/exim4/exim4.conf.template
Додамо туди наступну опцію десь на початку фалу, наприклад в секції MAIN CONFIGURATION SETTINGS:
primary_hostname = ssdev.pp.ua
Перезапустимо exim4:
# service exim4 restart
Основна робота зроблена. Давайте перевіримо надсилання пошти:
# echo testmail | /usr/sbin/sendmail your@real.email
В результаті на скриньку your@real.email має прийти мейл. І скоріш за все, він потрапить в спам, бо в нас ще не налаштовані захисти. На деякі поштовики мейл може взагалі не прийти, тому варто надіслати тестове повідомлення на мейли різних поштовиків, щоб переконатись, що поштовик працює.
Якщо все ОК, тоді можемо перейти до налаштування захисту, щоб зменшити вірогідність потрапляння в спам.
SPF
Це такий DNS-запис, який говорить про те, кому дозволено надсилати пошту від імені домену, в якому цей запис прописаний. Цей стандарт має цілий ряд параметрів, з якими можна ознайомитись на сайті стандарту. Для нас буде достатньо простої конфігурації, ось DNS запис, який потрібно додати до нашого домену:
@ TXT "v=spf1 a mx -all exp=spf.ssdev.pp.ua"
Якщо ви не в курсі, як це читати, то дуже просто:
<піддомен> <тип запису> "<значення>"
Якщо запис має бути для піддомену, наприклад, sub.ssdev.pp.ua, тоді вказується просто sub, а якщо треба запис для основного домену ssdev.pp.ua, тоді вказується символ @.
А тепер коротко про самі параметри SPF:
v=spf1 — вказує, що використовується стандарт SPF версії 1.
a — дає право надсилати пошту з основного домену та IP, які прописані в A-записах основного домену.
mx — дає право надсилати пошту з доменів, які прописані в MX-записах та IP, які прописані в A-записах цих MX-доменів.
-all — вказує на те, що пошту, яка не виконує правил SPF, потрібно відхиляти. Це дуже строге правило, яке іноді призводить до того, що такі мейли навіть не потраплять в спам. Щоб трохи пом’якшити цю ситуацію можна вказати ~all, в цьому випадку мейли будуть відмічені як невалідні та потраплять під спам-фільтри.
exp — вказує на домен, котрий має TXT-запис з поясненням щодо відхилення мейлів, які не пройшли SPF-верифікацію. Тобто якщо поштовик відхиляє мейл, то він може за допомогою цієї опції отримати повідомлення і включити його в пояснення своїх дій, які десь залогуються або відправляться адміністратору.
Оскільки ми вказали exp, то давайте додамо відповідний DNS-запис:
spf TXT "SPF protection: Sorry, you cant send email from your server."
Після додавання на оновлення DNS може піти трохи часу, іноді навіть до 48 годин.
Щоб перевірити TXT-записи для домену, виконайте команду:
# host -t txt ssdev.pp.ua
Перевірити валідність SPF-записів можна тут.
Оскільки ми будемо ще додавати DNS-записи, то не варто чекати — рухаємось далі.
DKIM
Ця технологія використовує відкритий та закритий ключ для того, щоб підписувати мейли електронним підписом, що дає можливість перевірити, чи відправник дійсно той, за кого себе видає.
Для того щоб exim4 міг підписувати ключ, необхідно встановити додаткові пакети:
# aptitude install opendkim opendkim-tools
Тепер треба створити папку та згенерувати туди ключі:
# mkdir /etc/exim4/dkim # opendkim-genkey -D /etc/exim4/dkim/ -d ssdev.pp.ua -s mail
Коротко про параметри:
-D — вказує директорію, куди потрібно зберегти згенеровані ключі;
-d — вказує назву домену, для якого потрібно згенерувати ключі, тобто туди треба вказати домен поштового сервера, який прописаний в PTR;
-s — вказує DKIM-селектор, зазвичай це mail.
Після виконання команд в папці /etc/exim4/dkim/ з’являться два файли: mail.private (закритий ключ) та mail.txt (дані для запису в DNS з відкритим ключем). Файл матиме іншу назву, якщо змінити значення параметра селектора -s.
Виведемо в консоль файл з даними DNS-запису з відкритим ключем:
# cat /etc/exim4/dkim/mail.txt
Ми побачимо щось на зразок цього:
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqG...DAQAB" ) ; ----- DKIM key mail for ssdev.pp.ua
Тепер потрібно для піддомену (в цьому випадку це mail._domainkey) прописати TXT DNS-запис зі значенням:
v=DKIM1; k=rsa; p=MIGfMA0GCSqG...DAQAB
Як бачите, зайві лапки та дужки потрібно забрати.
Також треба додати ще один DNS-запис:
_adsp._domainkey IN TXT "dkim=all"
Це буде задавати політику роботи з мейлами, які не підписані. Значення dkim=all говорить поштовикам, що всі мейли мають бути підписані, а непідписані мейли потрібно надіслати під спам-фільтри. Є ще більш строге значення dkim=discardable, при якому непідписані мейли будуть фільтруватись на етапі надсилання, тобто непідписані мейли можуть взагалі не доходити до сервера адресата.
Тепер перейменуємо ключі на імена, які включають в собі назву домена:
# mv /etc/exim4/dkim/mail.private /etc/exim4/dkim/ssdev.pp.ua.key # mv /etc/exim4/dkim/mail.txt /etc/exim4/dkim/ssdev.pp.ua.txt
Змінимо права доступу ключів:
# chown root:Debian-exim /etc/exim4/dkim/* # chmod 640 /etc/exim4/dkim/*
Тепер налаштуємо DKIM в exim4, для цього потрібно внести зміни в файл налаштувань:
# nano /etc/exim4/exim4.conf.template
Знаходимо секцію remote_smtp: (для пошуку комбінація клавіш Ctrl+W) і перед нею додаємо:
DKIM_DOMAIN_NAME = ${lc:${domain:$h_from:}} DKIM_FILE = /etc/exim4/dkim/${lc:${domain:$h_from:}}.key DKIM_PRIV_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
І редагуємо саму секцію:
remote_smtp: driver = smtp dkim_domain = DKIM_DOMAIN_NAME dkim_selector = mail dkim_private_key = DKIM_PRIV_KEY
Зауважте, що значення параметра dkim_selector має співпадати з тим, що ми вказували при генерації ключів та додаванні DNS-запису.
Перезавантажимо exim4:
# service exim4 restart
DMARC
Це ще один стандарт, що задає політику роботи з поштою, яка не пройшла SPF чи DKIM.
Розгляньмо простий приклад DNS-запису DMARC, якого вам буде цілком достатньо, щоб ваш сервер працював належним чином:
_dmarc IN TXT "v=DMARC1; p=none; sp=none; aspf=r; adkim=r; rua=mailto:dmarc@ssdev.pp.ua"
Опис параметрів наступний:
p (policy) — політика для основного домену, яка може мати наступні значення:
none — не приймати ніяких особливих дій, тобто все на розсуд поштовиків;
quarantine — надіслати в спам;
reject — відхиляти (тобто мейли не будуть доставлятись).
sp (subdomain policy) — політика для піддоменів, варіанти значень ті ж самі, що і для попереднього параметра p.
aspf — політика SPF, що може мати наступні значення:
r (relaxed) — дозволяти часткові співпадіння доменів, наприклад, дозволяти використання піддоменів, якщо прописаний лише основний домен;
s (strict) — строгий підхід, в якому допускається лише повне співпадіння доменів.
adkim — те саме, що і aspf, але для записів DKIM може мати ті самі значення.
rua — URI для надсилання щоденних звітів, де вказують мейл отримувача DMARC-звітів.
Якщо ви будете використовувати значення quarantine чи reject, тоді вам ще знадобиться параметр pct (percentage) — відсоток мейлів, для яких необхідно застосовувати політику, за замовчення це значення має 100. Тобто правильним підходом для строгої політики буде використання схожого запису:
_dmarc IN TXT "v=DMARC1; p=quarantine; sp=quarantine; aspf=s; adkim=s; pct=5; rua=mailto:dmarc@ssdev.pp.ua"
Потім щотижня поступово збільшувати значення pct до 100. Тоді можна використати reject і для нього теж поступово збільшувати pct з 5 до 100.
Перевірити валідність DMARC-записів для домену можна тут.
Перевірка та проблеми доставки
Налаштування готове. Тепер потрібно дочекатись оновлення DNS і можемо перевірити:
# echo testmail | /usr/sbin/sendmail your@real.email
Я завжди виконую перевірку відправляючи на свою скриньку в gmail.
Тепер заходимо в пошту, знаходимо отриманий мейл і дивимось його оригінал, щоб ми могли бачити заголовки. Знаходимо заголовок Authentication-Results і якщо там є наступне: spf=pass, dkim=pass, dmarc=pass та domain of root@ssdev.pp.ua designates 144.76.69.90 as permitted sender, значить все працює правильно.
Перший час пошта може не відразу всюди потрапляти у вхідні, має пройти деякий час та потрібно позначати такі мейли як “не спам”. Деякі поштовики мають різні фільтри, які призведуть до того, що вам потрібно буде чекати кілька днів, до того як ваші мейли пройдуть greylisting, такий фільтр, наприклад, є в urk.net.
Також може бути проблема з доставкою, якщо ваша IP в чорних списках. Перевірити це можна на різних сайтах, які не складно знайти в google, наприклад тут.
Ще бувають випадки, коли якийсь поштовик не доставляє ваші листи через власну політику. В таких випадках потрібно писати їм в техпідтримку та з’ясовувати причини. Наприклад, в мене була ситуація, коли yahoo не доставляв мою пошту аргументуючи це тим, що моя IP в чорному списку. Я тричі змінював IP в різних діапазонах, але це не виправило ситуації. Крім того, їхня політика включала співпрацю сервісів розсилок з їхньою програмою боротьби зі спамом, оскільки я не робив масових розсилок, то мені не було сенсу з цим розбиратись. Я був змушений віднести домен yahoo.com до чорного списку на своєму сайті, бо з цією поштою користувачі не змогли б підтвердити реєстрацію, про що я і повідомив в технічній підтримці yahoo. Через півроку мейли все таки почали доходити.
На проблему з доставкою ще може впливати вміст ваших мейлів. Тобто якщо ви будете розсилати одне й те саме повідомлення по базі з 100к мейлів, то скоріш за все спам-фільтри це побачать і почнуть вас маркувати як “спам”. На число доставлених мейлів вливає дуже багато факторів, але найбільший фактор — це налаштування згідно стандартів, які я описав в цій статті.
Використовуючи VPS від hetzner я стикнувся з проблемою, коли IPv4 сервера в локальній мережі відрізняється від IPv4 зовнішньої, при цьому exim4 використовував IPv6 при відправленні пошти. Щоб Змусити exim4 використовувати IPv4 довелось встановити зовнішню IP в /etc/hosts а також вимкнути IPv6 прописавши в /etc/exim4/exim4.conf.template перед стрічкою begin acl наступний рядок:
disable_ipv6 = true
А як ви надсилаєте мейли? Використовуєте власний сервер, чи використовуєте сторонній сервіс? З якими проблемами стикались і як вирішували? Відповіді залишайте в коментарях під статтею.