Персональный почтовый сервер

Если у Вас онлайн магазин или блог или любой другой сайт, которому требуется рассылать почтовые сообщения клиентам и Вы хотите, чтобы почта отправлялась с вашего домена — Вам нужен собственный SMTP сервер, построенный с использованием правильно настроенных Postfix и DKIM. Вы можете воспользоваться уже готовыми многофункциональными SMTP серверами, которые предоставляют различные почтовые службы, например, GMAIL или Yandex.Почта, но если Вам нужен именно ваш собственный сервер, то эта небольшая, но полноценная инструкция для Вас!

Как всегда, инструкция состоит из простых коротких шагов с минимумом текста. По возможности, конечно же…

Будет рассмотрена установка почтового агента (SMTP) Postfix, а также DKIM, TLS и всех необходимых записей на NS-серверах, чтобы добиться результата в 10 баллов на mail-tester.com.

Все примеры показаны на базе ОС Debian. Они также должны подойти без изменения для Ubuntu. Также за основу берется настройка почты для моего домена denisbondar.com.

DNS

Здесь и далее под доменом будет пониматься полное имя домена (FQDN). Я буду использовать везде имя своего домена denisbondar.com. Обратите внимание на то, что мой блог имеет адрес blog.denisbondar.com.

Для работы нашего почтового сервера необходимы три основные обязательные записи на NS-сервере, обслуживающем этот домен.

Вам необходимо открыть раздел управления серверами имен (NS) панели управления вашим хостингом. Она может называться как-то иначе, например, в DigitalOcean она называется Domains.

A-запись

Для вашего домена должна быть обязательно настроена A-запись (соответствие IP-адреса доменному имени). Но если на этом же домене работает ваш сайт, то запись уже есть. В моем случае сайт имеет адрес blog.denisbondar.com, а в качестве почтового я буду использовать denisbondar.com, поэтому я должен создать A-запись для denisbondar.com.

MX-запись

Эта запись указывает, какой mail exchanger используется в нашем домене. Так как мы используем наш собственный mail exchanger, то необходимо добавить следующую запись:

@ IN MX 0 "denisbondar.com."
MX-запись для домена в панели управления DigitalOcean
MX-запись для домена в панели управления DigitalOcean

PTR-запись

Также Вам необходимо настроить PTR-запись для Вашего IP-адреса сервера. Обычно это делается автоматически, если Вы пользуетесь услугами хостинговых компаний. Но в некоторых случаях, если Ваш сервер находится у Вас, а не в облаках, то эту настройку должен выполнить ваш интернет-провайдер, которому принадлежит IP-адрес вашего сервера.

В DigitalOcean ничего для этого делать не нужно — там PTR создается автоматически и соответствует указанному доменному имени вашего Droplet. У меня это выглядит вот так.

PTR-запись для моего IP-адреса в панели DigitalOcean
PTR-запись для моего IP-адреса в панели DigitalOcean

Postfix

Установка и настройка SMTP агента Postfis.

sudo apt update
sudo apt install -y postfix mailutils

Во время установки вам нужно будет выбрать Internet Site и далее указать ваш домен (в моем случае это denisbondar.com).

После установки отредактируйте файл /etc/postfix/main.cf

sudo nano /etc/postfix/main.cf

Найдите строку inet_interfaces и замените ее значение по умолчанию all на loopback-only. Это необходимо для того чтобы почтовый сервер принимал подключения только на локальном интерфейсе. Нам ведь нужно чтобы только наш сайт/блог/магазин мог отправлять почту через наш сервер, а не весь интернет.

Измените или добавьте в конец конфига следующую строку:

smtp_generic_maps = hash:/etc/postfix/generic_map

Найдите строку mydestination и отредактируйте ее значение следующим образом (только не забудьте указать свой домен вместо моего):

mydestination = $myhostname, denisbondar.com, localhost

Здесь первым в списке идет переменная $myhostname, значение которой соответствует имени вашего хоста. В моем случае оно denisbondar.com и конкретно в моем случае нет смысла также добавлять denisbondar.com в этот список, но у Вас имя хоста и почтовый домен могут отличаться. Обратите на это внимание.

Возможно также понадобится отключить IPv6, если с этим возникнут проблемы. Но для начала опустите эту модидфикацию:

inet_protocols = ipv4

Работа с файлом main.cf завершена.

Теперь создайте карту соответствия для писем с пустым полем from:

echo "@denisbondar.com    no-reply@denisbondar.com" | sudo tee -a /etc/postfix/generic_map

sudo postmap /etc/postfix/generic_map

Далее настроим псевдонимы, если это необходимо. Было бы правильным это сделать. Системные сообщения на сервере обычно отправляются пользователю root. Мы же можем указать в качестве псевдонима для root настоящий адрес электронной почты, на который будут приходить эти письма.

echo "root: myreadlemail@gmail.com" | sudo tee -a /etc/aliases

sudo newaliases

Вместо myreadlemail@gmail.com укажите свой настоящий адрес электронной почты.

Теперь перезагрузите postfix.

sudo systemctl restart postfix

На этом базовая настройка Postfix завершена и уже можно проверить его работу. Отправьте почту пользователю root или же на любой другой адрес электронной почты для проверки (укажите его вместо root):

echo "Test email body" | mail -s "Test email subject" root

TLS-шифрование

Шифрование можно не применять, однако почтовые клиенты ваших получателей будут видеть красный предупреждающий замок, что письма не зашифрованы. Например, gmail отображает такие письма следующим образом:

Отсутствие шифрования письма выглядит как красный замок
Отсутствие шифрования письма выглядит как красный замок
Исправим это. Создадим сертификат (это всё одна строка):
Подробная информация. Домен не шифрует почту.

Исправим это. Создадим сертификат (это всё одна строка):

sudo openssl req -new -nodes -x509 -out /etc/postfix/smtpd.pem -keyout /etc/postfix/smtpd.pem -days 3650

И снова отредактируем файл /etc/postfix/main.cf

sudo nano /etc/postfix/main.cf

Отыщите в файле блок настроек TLS и измените либо добавьте параметры в нем следующим образом:

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Теперь необходимо настроить Postfix на прием подключений на TLS порту (465/SMTPS). Отредактируйте файл /etc/postfix/master.cf

sudo nano /etc/postfix/master.cf

Необходимо раскомментировать строки таким образом, чтобы команда выглядела вот так (каждый параметр в этом файле находится в отдельной строке, так что придется найти их в отдельности и расскомментировать и изменить при необходимости):

smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

Перезапустите Postfix и снова проверьте его работу.

sudo systemctl restart postfix

echo "Test email body with TLS" | mail -s "Test email subject with TLS" root

Теперь в почтовом клиенте вы должны увидеть, что письмо зашифровано.

Красного замка нет
Красного замка нет
Подробная информация с TLS шифрованием
Подробная информация с TLS шифрованием

SPF (Sender Policy Framework)

SPF позволяет настроить список различных серверов, которые могут отправлять почту с вашего домена.

Эта настройка производится на NS-серверах, обслуживающих Ваш домен.

Вам необходимо добавить запись типа TXT для вашего домена, которая определяет, какие хосты могут отправлять почту используя ваш домен. Добавим сюда только IP-адреса нашего сервера, чтобы только наш сервер считался авторизованным. Для всех остальных будет применено правило «жесткий отказ» -all, чтобы гарантировать, что с нашего домена никакие другие серверы не смогут отправлять сообщения.

В моем случае я добавляю запись:

@ IN TXT "v=spf1 a mx ip4:207.154.240.75 -all"

В панели DigitalOcean это выглядит следующим образом.

Добавление TXT-записи SPF в консоли DigitalOcean

DKIM (DomainKeysIdentifiedMail)

DKIM — цифровая подпись, подтверждающая подлинность отправителя.

Необходимо установить пакет OpenDKIM и произвести его настройку.

sudo apt install -y opendkim opendkim-tools

Стандартный файл конфигурации /etc/opendkim.conf содержит слишком много комментариев и лишних опций, поэтому лучше сразу переименовать его в backup на всякий случай и начать работу с новым конфигом.

sudo mv /etc/opendkim.conf /etc/backup.opendkim.conf
sudo nano /etc/opendkim.conf

Приведём файл к виду:

AutoRestart         Yes
AutoRestartRate     10/1h
Umask               002
Syslog              yes
SyslogSuccess       Yes
LogWhy              Yes
Canonicalization    relaxed/simple
ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
InternalHosts       refile:/etc/opendkim/TrustedHosts
KeyTable            refile:/etc/opendkim/KeyTable
SigningTable        refile:/etc/opendkim/SigningTable
Mode                sv
PidFile             /var/run/opendkim/opendkim.pid
SignatureAlgorithm  rsa-sha256
UserID              opendkim:opendkim
Socket              inet:12301@localhost

В последнем параметре Socket указан порт 12301. Его можно изменить на любой другой при необходимости, а также не забыть сделать это далее.

Создадим все необходимые файлы со списками:

sudo mkdir -p /etc/opendkim
sudo touch /etc/opendkim/TrustedHosts
sudo touch /etc/opendkim/KeyTable
sudo touch /etc/opendkim/SigningTable

Теперь в файл /etc/opendkim/TrustedHosts и помещаем доверенные узлы, с которых может осуществляться отправка. В будущем, если нужно будет разрешить отправку почты с каких-то еще узлов, нужно будет добавить их в этот файл.

echo "127.0.0.1" | sudo tee -a /etc/opendkim/TrustedHosts
echo "localhost" | sudo tee -a /etc/opendkim/TrustedHosts
echo "denisbondar.com" | sudo tee -a /etc/opendkim/TrustedHosts

Теперь редактируем файл /etc/default/opendkim.

sudo nano /etc/default/opendkim

В нем необходимо изменить значение параметра SOCKET. Файла может не быть, либо файл может быть пустым, либо же SOCKET может быть закомментирован. В любом случае приводим значение параметра SOCKET к указанному и расскомментируем его. Если выше в файле /etc/opendkim.conf был указан другой номер порта, то измените его и здесь.

SOCKET=inet:12301@localhost

Включаем и запускаем службу opendkim.

sudo systemctl enable opendkim
sudo systemctl restart opendkim

Postfix

Необходимо внести изменения в /etc/postfix/main.cf. Открываем его.

sudo nano /etc/postfix/main.cf

И редактируем либо добавляем следующие строки:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

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

Перезапускаем Postfix.

sudo systemctl restart postfix

Создание сертификата

Описанные действия также необходимо будет выполнить при добавлении новых доменов, с которых ваш почтовый сервер будет уполномочен отправлять почту. Например, если у вас на сервере появится еще один сайт, работающий на другом домене, почта с которого должна отправляться с его доменного имени.

Для создания сертификата можно воспользоваться онлайн инструментом dkimcore.org или же создать самому следующим образом:

sudo mkdir -p /etc/opendkim/denisbondar.com
sudo opendkim-genkey -D /etc/opendkim/denisbondar.com/ --domain denisbondar.com --selector mail

В результате будет создана пара ключей: mail.private (закрытый) и mail.txt (открытый). Открытый ключ необходимо прописать в NS-сервере. В данном случае mail — это селектор (он может быть любым).

Назначим для каталога с ключами группу opendkim и также изменим права доступа.

sudo chown :opendkim /etc/opendkim/denisbondar.com/*
sudo chmod g+rw /etc/opendkim/denisbondar.com/*

Создаем таблицу /etc/opendkim/KeyTable — в ней находится список соответствий между селекторами, доменами и файлами с закрытыми ключами.

Формат таблицы следующий:

<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

В нашем случае таблица будет создана следующим образом:

echo "mail._domainkey.denisbondar.com denisbondar.com:mail:/etc/opendkim/denisbondar.com/mail.private" | sudo tee -a /etc/opendkim/KeyTable

Создаем таблицу /etc/opendkim/SigningTable — в ней находится список соответствия между определенными email-адресами и записями в KeyTable.

echo "*@denisbondar.com mail._domainkey.denisbondar.com" | sudo tee -a /etc/opendkim/SigningTable

Перезапускаем OpenDKIM.

sudo systemctl restart opendkim

Настройки DNS

Теперь необходимо внести следующие изменения в настройки вашего домена (NS-серверов).

Необходимо создать запись типа TXT и содержимым из файла открытого ключа.

Выводим в консоль содержимое файла открытого ключа:

sudo cat /etc/opendkim/denisbondar.com/mail.txt

Теперь создаем TXT-запись следующего вида:

mail._domainkey IN TXT "v=DKIM1; k=rsa; p=...из содержимого mail.txt..."

Обратите внимание на то, что если вы вставляете значение поля в консоли вашего хостинга, то вам необходимо вставить только текст без кавычек. Обратите внимание, что в файле mail.txt строка с ключом разбита на подстроки — вам необходимо их соединить в одну.

Добавление записей выглядит точно так же, как и в предыдущих примерах. Также можно добавить следующие TXT-записи:

_domainkey IN TXT "o=~; r=postmaster@denisbondar.com"
_adsp._domainkey IN TXT "dkim=all"
_dmarc IN TXT "v=DMARC1; p=none"

Проверка

Для проверки воспользуемся сервисом mail-tester.com.

На странице сервиса отображается адрес электронной почты, на который следует отправить письмо для теста. Копируем его и отправляем на него письмо из консоли сервера:

echo "Test letter." | mail -s "Testing denisbondar.com" -a "Smtp: localhost:25" -a "From: blog@denisbondar.com" -a "List-Unsubscribe: <mailto: unsubscribe@denisbondar.com?subject=unsubscribe>" test-xxxxxxx@srv1.mail-tester.com

После чего нажимаем «Затем проверить оценку».

В приведенном выше примере отправки тестового письма содержится заголовок List-Unsubscribe. В данном случае он необходим только для того чтобы получить максимальный бал. Очень желательно, чтобы ваши письма по возможности имели такой заголовок — это требование для рассылок. В личной переписке в этом заголовке, конечно же, смысла нет.

Ну и, долгожданный результат!

10 из 10 на mail-tester.com
10 из 10 на mail-tester.com

Прокомментировать