По завершении первой и второй частей у нас установлен рабочий SMTP-сервер Postfix и IMAP-сервер Dovecot. Теперь мы можем отправлять и получать электронные письма через почтовый клиент на компьютере. Несмотря на то что у меня корректно настроены записи MX, A и PTR, письма в Gmail и Outlook отмечаются как спам. В этой части мы обсудим, как улучшить доставку писем в папку «Входящие» получателя, настроив SPF и DKIM на сервере Ubuntu.
Содержание статьи
- 1 Что представляют собой записи SPF и DKIM?
- 2 Добавьте запись SPF в систему DNS.
- 3 Конфигурация агента для политики SPF.
- 4 Конфигурация DKIM
- 5 Создание таблицы подписей, таблицы ключей и файла с доверенными хостами.
- 6 Создание пары ключей — закрытого и открытого.
- 7 Размещение вашего открытого ключа в записях DNS.
- 8 Проверка ключа DKIM
- 9 Интеграция Postfix с OpenDKIM
- 10 Верификация SPF и DKIM
- 11 Postfix не удается установить соединение с OpenDKIM.
- 12 Проверка логов OpenDKIM.
- 13 Некорректная настройка в почтовом приложении.
- 14 Проверка процесса оценки и распределения письма.
- 15 Почтовые сервисы Microsoft
- 16 Что предпринять, если ваши письма продолжают попадать в папку со спамом?
- 17 Следующий этап
- 18 Примечание
Что представляют собой записи SPF и DKIM?
SPF и DKIM представляют собой два вида TXT-записей в DNS, которые помогают выявлять фальшивые сообщения и обеспечивают доставку легитимных писем в папку «Входящие» у получателя, а не в спам. Если ваш домен используется для рассылки поддельных писем, то велика вероятность, что ваши сообщения окажутся в спаме, если получатель не добавит вас в свои контакты.
SPF (Sender Policy Framework) представляет собой запись, которая определяет, какие хосты или IP-адреса имеют право отправлять электронные письма от имени определённого домена. Рекомендуется разрешать отправку писем только вашему почтовому серверу или серверу вашего провайдера.
DKIM (DomainKeys Identified Mail) применяет закрытый ключ для формирования подписи к сообщениям, отправляемым с вашего домена. SMTP-серверы, принимающие письма, проверяют эту подпись, используя открытый ключ, который размещен в вашем DNS-менеджере.
Добавьте запись SPF в систему DNS.
В вашем DNS-управлении добавьте новую TXT-запись в соответствии с приведенной ниже инструкцией.
TXT @ v=spf1 mx ~all
- TXT обозначает, что это запись типа TXT.
- Введите символ @ в поле для имени.
- v=spf1 обозначает, что это запись для SPF, и версия протокола — SPF1.
- MX указывает на то, что все серверы, перечисленные в записях MX, имеют право отправлять электронные письма от имени вашего домена, тогда как другие серверы лишены такой возможности.
- ~Все указывает на то, что сообщения с вашего домена должны отправляться исключительно с хостов, указанных в SPF-записи. Сообщения, отправленные с других хостов, будут считаться ненадежными. Альтернативы включают +all, — all и? all, однако их использование встречается довольно редко.
-all указывает на то, что сообщения, приходящие с незарегистрированных хостов, должны быть отклонены, не попадая в папки «Входящие» или «Спам» у получателя. Я заметил, что это применяет facebook.com, но в целом такая жесткая политика нам не требуется.
Некоторые могут считать, что использование — all предпочтительнее, так как он блокирует сообщения с недоверенных хостов. Однако внедрение — all в политику SPF может привести к тому, что ваши собственные сообщения будут отклоняться, особенно если у получателя имеется два SMTP-сервера, и основной из них выйдет из строя. В таком случае ваши письма временно сохранятся на резервном SMTP-сервере. Как только основной сервер снова станет доступен, письмо будет перенаправлено с резервного сервера на основной. Поскольку резервный SMTP-сервер получателя не указан в вашей политике SPF, письмо будет отклонено основным сервером получателя. Поэтому важно корректно прописать свою политику SPF.~all.
Имейте в виду, что для некоторых DNS-менеджеров необходимо заключать запись SPF в кавычки, как это указано ниже.
TXT @ "v=spf1 mx ~all"
Для проверки распространения вашей SPF-записи в публичной сети вы можете воспользоваться утилитой dig на своем сервере Linux. Если вы используете Ubuntu, сначала установите пакет bind9-dnsutils с помощью команды: sudo apt install bind9-dnsutils.
dig ваш-домен.com txt
Опция txt сообщает dig, что мы желаем получить только записи типа TXT.

Вы можете воспользоваться dmarcian SPF surveyor для анализа корректности синтаксиса вашей SPF-записи.
Конфигурация агента для политики SPF.
Необходимо также настроить наш SMTP-сервер Postfix для проверки SPF-записей входящих писем. Хотя это не влияет на доставку исходящих писем, данная мера помогает выявлять поддельные входящие сообщения.
Сначала нужно установить все необходимые пакеты:
sudo apt install postfix-policyd-spf-python
После этого внесите изменения в файл конфигурации главного процесса Postfix.
sudo nano /etc/postfix/master.cf
Включите следующие строки в конец файла, чтобы настроить Postfix на запуск демона политики SPF при его инициализации.
policyd-spf unix - n n - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf
Сохраните изменения и закройте документ. После этого внесите правки в основной конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
В конце файла необходимо добавить указанные строки. Первая строка отвечает за настройку времени ожидания для агента политики Postfix. Остальные строки устанавливают ограничения на входящие сообщения, отклоняя несанкционированные письма и проверяя запись SPF.
policyd-spf_time_limit = 3600 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service unix:private/policyd-spf
Сохраните изменения и закройте файл. После этого перезапустите Postfix.
sudo systemctl restart postfix
Когда вы получите письмо с домена, имеющего запись SPF, в заголовке необработанного сообщения отобразятся результаты проверки SPF. Пример заголовка демонстрирует, что отправитель использовал авторизованный хост для отправки письма.
Received-SPF: Pass (sender SPF authorized).
Конфигурация DKIM
Сначала необходимо установить OpenDKIM — это открытая реализация системы аутентификации отправителей DKIM.
sudo apt install opendkim opendkim-tools
После этого включите пользователя postfix в группу opendkim.
sudo gpasswd - a postfix opendkim
Внесите изменения в главный файл настройки OpenDKIM.
sudo nano /etc/opendkim.conf
Определите следующую последовательность.
Syslog yes
Логи OpenDKIM по умолчанию хранятся в файле /var/log/mail.log. Чтобы получить более детальные логи для отладки, добавьте следующую строку.
Logwhy yes
Отыщите указанные строки.
#Domain example.com #KeyFile /etc/dkimkeys/dkim. key #Selector 2007
По умолчанию эти строки закомментированы. Пожалуйста, оставьте их в таком виде.
Затем обнаружьте следующие строки. Уберите комментарии и замените simple на relaxed/simple.
#Canonicalization simple #Mode sv #SubDomains no
Добавьте следующие строки под строкой #ADSPAction continue. Если в вашем файле отсутствует эта строка, просто вставьте их ниже SubDomains no.
AutoRestart yes AutoRestartRate 10/1M Background yes DNSTimeout 5 SignatureAlgorithm rsa-sha256
В конце файла добавьте следующие строки. (Учтите, что в Ubuntu 18.04 и 20.04 UserID уже назначен как opendkim)
#OpenDKIM user # Не забудьте добавить пользователя postfix в группу opendkim UserID opendkim # Соответствие доменов в адресах From с ключами, используемыми для подписи сообщений KeyTable refile:/etc/opendkim/key. table SigningTable refile:/etc/opendkim/signing. table # Хосты, которые нужно игнорировать при проверке подписей ExternalIgnoreList /etc/opendkim/trusted. hosts # Набор внутренних хостов, чья почта должна быть подписана InternalHosts /etc/opendkim/trusted. hosts
Закройте файл и сохраните изменения.
Создание таблицы подписей, таблицы ключей и файла с доверенными хостами.
Организуйте директорию для OpenDKIM.
sudo mkdir /etc/opendkim sudo mkdir /etc/opendkim/keys
Поменяйте владельца директории с root на opendkim и убедитесь, что доступ на чтение и запись имеет только пользователь opendkim.
sudo chown - R opendkim:opendkim /etc/opendkim sudo chmod go-rw /etc/opendkim/keys
Составьте таблицу с подписями.
sudo nano /etc/opendkim/signing. table
Внесите следующие две строки в файл. Они сообщают OpenDKIM, что если отправитель с вашего сервера использует адрес с доменом @your-domain.com, то для подписи будет применяться закрытый ключ, связанный с default._domainkey. your-domain.com. Вторая строка указывает, что закрытый ключ также будет использоваться для подписи писем с поддоменов.
*@your-domain.com default._domainkey.your-domain.com *@*.your-domain.com default._domainkey.your-domain.com
Закройте файл после сохранения. Затем создайте таблицу ключей.
sudo nano /etc/opendkim/key. table
Укажите строку, которая определяет расположение закрытого ключа.
default._domainkey.your-domain.com your-domain.com:default:/etc/opendkim/keys/your-domain.com/default. private
Сохраните файл и закройте его. Затем создайте файл с перечнем доверенных хостов.
sudo nano /etc/opendkim/trusted. hosts
Включите следующие строки в только что созданный файл. Это указывает OpenDKIM, что если сообщение отправлено с localhost или с того же домена, OpenDKIM должен лишь подписать его, не проводя проверку DKIM.
127.0.0.1 localhost .your-domain.com
Закройте файл и сохраните изменения.
Обратите внимание: не добавляйте звездочку в адрес домена, например: *.ваш-домен. ком. Должна быть только точка перед доменом.
Создание пары ключей — закрытого и открытого.
Поскольку DKIM применяется для подписи исходящих писем и проверки входящих, необходимо создать закрытый ключ для подписи и открытый ключ для проверки удалёнными серверами. Открытый ключ будет размещён в DNS.
Создайте отдельную директорию для домена.
sudo mkdir /etc/opendkim/keys/your-domain.com
Создайте ключи, используя утилиту opendkim-genkey.
sudo opendkim-genkey - b 2048 - d your-domain.com-D /etc/opendkim/ключи/your-domain.com - s default - v
Команда создаст ключи размером 2048 бит. Параметр — d (домен) обозначает домен, а — D (директория) указывает путь, где будут сохраняться ключи. Мы также используем default в качестве селектора (-s), который также называют именем. После выполнения команды закрытый ключ будет сохранён в файле default. private, а открытый ключ — в файле default. txt.
Установите пользователя opendkim в качестве владельца закрытого ключа.
sudo chown opendkim:opendkim /etc/opendkim/keys/your-domain.com/default. private
Измените настройки доступа так, чтобы только пользователь opendkim имел возможность читать и записывать файл.
sudo chmod 600 /etc/opendkim/keys/your-domain.com/default. private
Размещение вашего открытого ключа в записях DNS.
Показать открытый ключ.
sudo cat /etc/opendkim/keys/your-domain.com/default. txt
Строка, расположенная после параметра p, представляет собой открытый ключ.
Проверка ключа DKIM
Воспользуйтесь следующей командой на сервере Ubuntu для проверки вашего ключа.
sudo opendkim-testkey - d your-domain.com - s default - vvv
Если всё хорошо, в результате выполнения команды вы увидите сообщение Key OK.
opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'default._domainkey. your-domain.com' opendkim-testkey: key secure opendkim-testkey: key OK
Учтите, что для вашей записи DKIM может потребоваться некоторое время, чтобы распространиться в сети. В зависимости от вашего регистратора домена, DNS-запись может обновиться сразу или занять до 24 часов. Вы можете посетить сайт https://www.dmarcanalyzer.com/dkim/dkim-check/, указать «default» в качестве селектора и ввести имя вашего домена, чтобы проверить статус распространения записи DKIM.
Если в результате выполнения команды появится сообщение Key not secure, не стоит волноваться. Это указывает на то, что на вашем домене не активирован DNSSEC. DNSSEC — это стандарт безопасности, который обеспечивает защищенные DNS-запросы. Многие домены не используют DNSSEC, поэтому не нужно беспокоиться о появлении сообщения Key not secure. Вы можете смело продолжать следовать этому руководству.
Если вы столкнулись с ошибкой «query timed out», необходимо закомментировать соответствующую строку в файле /etc/opendkim.conf и перезапустить службу opendkim.service.
TrustAnchorFile /usr/share/dns/root. key
Интеграция Postfix с OpenDKIM
Postfix может работать с OpenDKIM через Unix-сокет. Стандартный путь к файлу сокета OpenDKIM — /var/run/opendkim/opendkim. sock, что указано в конфигурационном файле /etc/opendkim.conf.Однако SMTP-демон Postfix, который поставляется с Ubuntu, функционирует в chroot-окружении, что подразумевает, что все обращения к именам файлов осуществляются относительно директории очереди Postfix (/var/spool/postfix). Поэтому необходимо изменить путь к Unix-сокету OpenDKIM.
Создайте каталог для размещения файла сокета OpenDKIM и ограничьте доступ к нему только для пользователя opendkim и группы postfix.
sudo mkdir /var/spool/postfix/opendkim sudo chown opendkim:postfix /var/spool/postfix/opendkim
После этого внесите изменения в главный конфигурационный файл OpenDKIM.
sudo nano /etc/opendkim.conf
Найдите следующую строку (Ubuntu 18.04).
Socket local:/var/run/opendkim/opendkim. sock
или (Ubuntu 22.04/20.04)
Socket local:/run/opendkim/opendkim. sock
Замените её на новую строку. (Если вышеуказанная строка отсутствует, добавьте следующую.)
Socket local:/var/spool/postfix/opendkim/opendkim. sock
Закройте файл и сохраните изменения.
Если вам удастся обнаружить следующую строку в файле /etc/default/opendkim.
SOCKET="local:/var/run/opendkim/opendkim. sock"
SOCKET=local:$RUNDIR/opendkim. sock
SOCKET="local:/var/spool/postfix/opendkim/opendkim. sock"

Закройте файл и сохраните изменения.
Следующим шагом необходимо внести изменения в главный конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
В конце файла добавьте следующие строки, чтобы Postfix мог взаимодействовать с OpenDKIM через milter-протокол.
# Конфигурация Milter milter_default_action = accept milter_protocol = 6 smtpd_milters = local:opendkim/opendkim. sock non_smtpd_milters = $smtpd_milters
Закройте и сохраните файл, после чего перезапустите службы opendkim и postfix.
sudo systemctl restart opendkim postfix
Верификация SPF и DKIM
Теперь вы можете отправить пробное письмо с вашего почтового сервера на свою учетную запись Gmail, чтобы убедиться, что проверки SPF и DKIM успешно выполнены. В Gmail, в открытом письме, нажмите на кнопку «показать оригинал» в выпадающем меню справа, чтобы увидеть результаты проверки аутентичности.
Почтовый сервер выполнит также проверку SPF и DKIM для домена отправителя. Результаты этих проверок можно найти в заголовках письма. Ниже представлен пример проверки SPF и DKIM для отправителя, использующего Gmail.
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::c2d; helo=mail-yw1-xc2d. google.com; [email protected]; receiver= Authentication-Results: email.linux16.ru; dkim=pass (2048-bit key; unprotected) header. d=gmail.com [email protected] header. b="XWMRd2co"; dkim-atps=neutral
Postfix не удается установить соединение с OpenDKIM.
В случае, если ваше письмо не подписано, а проверка DKIM завершилась неудачно, можно обратиться к журналу postfix (/var/log/mail.log), чтобы определить причину проблемы в настройках. Если в этом журнале обнаружена следующая ошибка…
connect to Milter service local:opendkim/opendkim. sock: No such file or directory
Проверьте, активирована ли служба opendkim.
systemctl status opendkim
Если opendkim запущен, но ошибка по-прежнему возникает, это указывает на то, что Postfix не способен установить соединение с OpenDKIM через Unix-сокет (local
Для устранения данной проблемы вы можете настроить OpenDKIM для работы через сокет TCP/IP вместо сокета Unix. Хотя сокет Unix обычно обеспечивает более высокую скорость, если он не функционирует на вашем сервере, рекомендуется использовать сокет TCP/IP.
sudo nano /etc/opendkim.conf
Отследите следующую строку:
Socket local:/var/spool/postfix/opendkim/opendkim. sock
Замените её на
Socket inet:8892@localhost
OpenDKIM теперь будет принимать соединения через сокет TCP/IP по адресу 127.0.0.1:8892. После этого сохраните изменения и закройте файл. Далее необходимо внести изменения в основной конфигурационный файл Postfix.
sudo nano /etc/postfix/main.cf
Отследите следующую строку:
smtpd_milters = local:opendkim/opendkim. sock
Замените её на:
smtpd_milters = inet:127.0.0.1:8892
Теперь Postfix будет взаимодействовать с OpenDKIM через TCP/IP сокет. Необходимо перезапустить как OpenDKIM, так и Postfix.
sudo systemctl restart opendkim postfix
Проверка логов OpenDKIM.
Журналы OpenDKIM порой могут оказаться полезными для выявления причин возникших проблем.
sudo journalctl - eu opendkim
Однажды я столкнулся с такой ошибкой.
opendkim[474285]: key '1': dkimf_db_get(): Connection was killed opendkim[474285]: 16F53B606: error loading key '1'
Мне просто потребовалось перезапустить OpenDKIM для устранения этой ошибки.
sudo systemctl restart opendkim
Некорректная настройка в почтовом приложении.
Подпись DKIM может не срабатывать, если в вашем почтовом клиенте неправильно настроены параметры SMTP/IMAP.
Корректные параметры:
- Протокол SMTP: укажите mail.your-domain.com в качестве сервера, установите порт 587 и выберите STARTTLS. В качестве метода аутентификации используйте обычный пароль.
- Протокол IMAP: укажите mail.your-domain.com в качестве сервера, установите порт 143 и используйте STARTTLS. Для аутентификации выберите обычный пароль.
- Протокол SMTP: укажите mail.your-domain.com в поле сервера, установите порт 465 и выберите SSL/TLS. Для аутентификации выберите стандартный пароль.
- Протокол IMAP: укажите mail.your-domain.com в поле для имени сервера, выберите порт 993 и используйте SSL/TLS. Для метода аутентификации выберите обычный пароль.
Ошибочные конфигурации:
- Применение порта 25 для SMTP в почтовых клиентах при отправке исходящих сообщений.
- Метод шифрования не был выбран.
Порт 25 предназначен для взаимодействия серверов SMTP. Не рекомендуется использовать его в почтовом клиенте для отправки исходящих сообщений.
В вашем почтовом приложении необходимо выбрать способ шифрования: STARTTLS или SSL/TLS.
Проверка процесса оценки и распределения письма.
Вы можете посетить сайт https://www.mail-tester.com, где вам будет представлен уникальный адрес электронной почты. Отправьте письмо с вашего домена на указанный адрес, чтобы узнать свою оценку. Как видно, я получил максимальный балл.

Mail-tester.com предоставляет информацию исключительно о вашем рейтинге отправителя. Однако существует еще один инструмент, называемый GlockApps, который дает возможность выяснить, попадает ли ваше сообщение в папку «Входящие», «Спам» или же полностью блокируется. Этот сервис совместим с различными популярными почтовыми провайдерами, включая Gmail, Outlook, Hotmail, Yahoo Mail, iCloud и другими.

Почтовые сервисы Microsoft
В моем тесте электронное письмо успешно доставлено в мой Gmail.Тем не менее, в почтовом ящике outlook.com оно по-прежнему отображается как спам, несмотря на то что оба протокола SPF и DKIM были пройдены.
Microsoft применяет свой собственный черный список, который предотвращает отправку писем с множества легитимных IP-адресов. Если ваши сообщения отклоняются в Outlook или Hotmail, вам следует воспользоваться руководством, представленным ниже, чтобы обойти блокировку Microsoft Outlook.
- Способы обхода черного списка Microsoft Outlook и других подобных списков.
Что предпринять, если ваши письма продолжают попадать в папку со спамом?
Ключевыми аспектами являются репутация домена и репутация IP-адреса. Для автоматического повышения своей репутации вы можете воспользоваться сервисом для прогрева электронной почты.
- Автоматизированный процесс прогрева IP-адреса и домена для вашего почтового сервера.
Вот ещё несколько рекомендаций для вас в этой статье:
- 7 действенных рекомендаций, чтобы ваши письма не попадали в спам.
Следующий этап
Примечание
В данной статье я указал umask 002 в конфигурационном файле /etc/opendkim.conf.Один из читателей оставил комментарий, что это помогло ему решить его проблему. Тем не менее, в Ubuntu 18.04 значение умаска по умолчанию в файле /etc/opendkim.conf составляет 007, что корректно функционирует на моих рабочих серверах. Умаск задает права доступа для файла сокета OpenDKIM, расположенного по пути /var/spool/postfix/opendkim/opendkim. sock.
- Пользователи, не относящиеся к группе opendkim, могут читать и выполнять, но не имеют прав на запись.
- Пользователи, которые не являются членами группы opendkim, не обладают правами на чтение, запись или выполнение операций.
Помнится, по умолчанию значение umask 002 установлено в Ubuntu 14.04 и 16.04, поэтому я применил его при написании этой статьи для сервера Ubuntu 16.04.
Если пользователь postfix уже входит в группу opendkim, то менять умаск на 002 не требуется.
sudo gpasswd - a postfix opendkim
Я указал эту команду в разделе установки OpenDKIM, но мне любопытно, почему некоторые люди не обращают на нее внимания и игнорируют.

