Персональный почтовый сервер #
Если у Вас онлайн магазин или блог или любой другой сайт, которому требуется рассылать почтовые сообщения клиентам и Вы хотите, чтобы почта отправлялась с вашего домена — Вам нужен собственный 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."
Если у вас несколько субдоменов, то для каждого из них должна быть такая запись.
В пользовательском интерфейсе DigitailOcean это выглядит следующим образом. MX-запись для домена в панели управления DigitalOcean
PTR-запись #
Также Вам необходимо настроить PTR-запись для Вашего IP-адреса сервера. Обычно это делается автоматически, если Вы пользуетесь услугами хостинговых компаний. Но в некоторых случаях, если Ваш сервер находится у Вас, а не в облаках, то эту настройку должен выполнить ваш интернет-провайдер, которому принадлежит IP-адрес вашего сервера. Также обратите внимание, есть ли у вас PTR для IPv6 — это пригодится далее.
В DigitalOcean ничего для этого делать не нужно — там PTR создается автоматически и соответствует указанному доменному имени вашего Droplet. У меня это выглядит вот так. PTR-запись для моего IP-адреса в панели DigitalOcean
Подтвердить домен в Google #
Google может и скорее всего будет отклонять почту с неподтвержденных доменов. Поэтому подтвердите домен перейдя по ссылке https://postmaster.google.com — это займет всего минуту.
Больше информации здесь.
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
. Это необходимо для того чтобы почтовый сервер принимал подключения только на локальном интерфейсе. Нам ведь нужно чтобы только наш сайт/блог/магазин мог отправлять почту через наш сервер, а не весь интернет. Если в будущем понадобится отправлять почту с других ваших серверов через этот, нужно будет добавить интерфейсы здесь.
Найдите строку mydestination
и отредактируйте ее указав все домены, с которых сервер будет отправлять почту (через запятую):
mydestination = $myhostname, denisbondar.com
Здесь первым в списке идет переменная $myhostname
, значение которой соответствует имени вашего хоста. В моем случае оно denisbondar.com и конкретно в моем случае нет смысла также добавлять denisbondar.com в этот список, но у Вас имя хоста и почтовый домен могут отличаться. Обратите на это внимание.
Если ваш хостер не поддерживает PTR IPv6, то нужно оставить только протокол IPv4, иначе при попытке работы через IPv6 возникнут проблемы с PTR:
inet_protocols = ipv4
Работа с файлом main.cf завершена.
Далее настроим псевдонимы, если это необходимо. Было бы правильным это сделать. Системные сообщения на сервере обычно отправляются пользователю 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 -days 3650 \
-out /etc/postfix/smtpd.pem \
-keyout /etc/postfix/smtpd.pem
И снова отредактируем файл /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 - y - - 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 шифрованием
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/opendkim.conf.backup
sudo nano /etc/opendkim.conf
Приведём файл к виду:
AutoRestart Yes
AutoRestartRate 10/1h
Background yes
DNSTimeout 5
Umask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/trusted.hosts
InternalHosts refile:/etc/opendkim/trusted.hosts
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
Mode sv
PidFile /run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Создадим все необходимые каталоги и файлы:
sudo mkdir -p /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys
sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:opendkim /var/spool/postfix/opendkim
sudo touch /etc/opendkim/key.table
sudo touch /etc/opendkim/signing.table
Теперь в файл /etc/opendkim/trusted.hosts и помещаем доверенные узлы, с которых может осуществляться отправка. В будущем, если нужно будет разрешить отправку почты с каких-то еще узлов, нужно будет добавить их в этот файл.
sudo tee -a /etc/opendkim/trusted.hosts <<EOT
127.0.0.0/8
[::ffff:127.0.0.0]/104
[::1]/128
localhost
denisbondar.com
*.denisbondar.com
EOT
Теперь редактируем файл /etc/default/opendkim
sudo nano /etc/default/opendkim
Здесь нужно изменить (добавить) сокет, на котором OpenDKIM будет принимать соединения.
SOCKET=local:/var/spool/postfix/opendkim/opendkim.sock
Включаем и запускаем службу opendkim.
sudo systemctl enable opendkim
sudo systemctl restart opendkim
Создание ключей #
Описанные действия также необходимо будет выполнить при добавлении новых доменов, с которых ваш почтовый сервер будет уполномочен отправлять почту. Например, если у вас на сервере появится еще один сайт, работающий на другом домене, почта с которого должна отправляться с его доменного имени.
Для создания сертификата можно воспользоваться онлайн инструментом dkimcore.org или же создать самому следующим образом:
sudo mkdir -p /etc/opendkim/keys/denisbondar.com
sudo opendkim-genkey -b 2048 --selector mail --domain denisbondar.com -D /etc/opendkim/keys/denisbondar.com/
sudo chown opendkim:opendkim /etc/opendkim/keys/denisbondar.com/mail.private
sudo chmod 600 /etc/opendkim/keys/denisbondar.com/mail.private
В результате будет создана пара ключей: mail.private (закрытый) и mail.txt (открытый). Открытый ключ далее необходимо будет прописать в NS-сервере. В данном случае mail — это селектор (он может быть любым).
Если доменов/субдоменов несколько, нужно повторить эту процедуру для каждого из них.
Создаем таблицу /etc/opendkim/key.table — в ней находится список соответствий между селекторами, доменами и файлами с закрытыми ключами.
Формат таблицы следующий:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>
В нашем случае таблица будет создана следующим образом:
echo "mail._domainkey.denisbondar.com denisbondar.com:mail:/etc/opendkim/keys/denisbondar.com/mail.private" \
| sudo tee -a /etc/opendkim/key.table
Создаем таблицу /etc/opendkim/signing.table — в ней находится список соответствия между определенными email-адресами и записями в key.table
.
echo "*@denisbondar.com mail._domainkey.denisbondar.com" \
| sudo tee -a /etc/opendkim/signing.table
Перезапускаем OpenDKIM.
sudo systemctl restart opendkim
Настройки DNS #
Теперь необходимо внести следующие изменения в настройки вашего домена (NS-серверов).
Необходимо создать запись типа TXT и содержимым из файла открытого ключа.
Выводим в консоль содержимое файла открытого ключа:
sudo cat /etc/opendkim/keys/denisbondar.com/mail.txt | awk -F'"' '{print $2}' ORS=''
Теперь создаем TXT-запись следующего вида (значением записи является заключенная в кавычки строка, полученная по команде выше):
mail._domainkey IN TXT "v=DKIM1; ..."
Добавьте также следующие TXT записи (для каждого своего субдомена):
_domainkey IN TXT "o=~; r=postmaster@denisbondar.com"
_dmarc IN TXT "v=DMARC1; p=none"
Проверка #
Для проверки ключа, выполните:
sudo opendkim-testkey -d denisbondar.com -s mail -vvv
Postfix #
Добавить пользователя postfix в группу opendkim:
sudo adduser postfix opendkim
Теперь необходимо внести изменения в /etc/postfix/main.cf
sudo nano /etc/postfix/main.cf
Редактируем либо добавляем следующие строки. Так как Postfix работает в chroot, то путь к файловому сокету будет относительно chroot:
milter_protocol = 6
milter_default_action = accept
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Перезапускаем Postfix.
sudo systemctl restart opendkim postfix
Проверка #
Для полной проверки воспользуемся сервисом 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. В данном случае он необходим только для того чтобы получить максимальный бал. Очень желательно, чтобы ваши письма по возможности имели такой заголовок — это требование для рассылок. В личной переписке в этом заголовке, конечно же, смысла нет.
Ну и, долгожданный результат!
Всё настроено превосходно