Настройка Autodiscover для своего почтового сервера

Тематические термины: SMTP , POP , IMAP , DNS , XML , NGINX .

Разберем процесс создания инфраструктуры для автоматической настройки почтовых клиентов. Для корректной работы Autodiscover нужен комплексный подход, так как у разных почтовых клиентов свои требования.

1. Определение по имени сервера

Это самый простой способ для автообнаружения почтового сервера почтовым клиентом. Он заключается в том, что некоторые клиенты ищут сервер по типичным именам, поэтому все, что нам нужно — дать корректное имя нашему почтовику. Как правило, это такие названия:

  • mail
  • relay
  • email

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

2. Microsoft Outlook

Для автоматической настройки почтового клиента, идет https POST-запрос к документу autodiscover.xml. При этом, Outlook сначала попробует найти сервер по записи в DNS autodiscover.server.domain, затем к просто к домену server.domain и затем — к SRV-записи _autodiscover._tcp.server.domain. Таким образом, необходимо настроить DNS и веб-сервер.

DNS

С DNS все просто — создаем А- (или CNAME-) и SRV-записи. Пример таких записей в bind:

autodiscover IN A 111.111.111.111

* где 111.111.111.111 — IP-адрес на наш веб-сервер, который будет возвращать документ XML.

_autodiscover._tcp IN SRV 0 0 443 autodiscover.remontka.com.

* где autodiscover.remontka.com — наша запись autodiscover в домене remontka.com.

Веб-сервер

В качестве примера, настройку выполним на веб-сервере NGINX, который работает на Linux. Если он не установлен, выполняем инсталляцию.

а) если сервер под CentOS / Red Hat :

yum install epel-release

yum install nginx

б) если сервер под Debian / Ubuntu :

apt-get install nginx

После разрешаем автозапуск и стартуем сервис:

systemctl enable nginx

systemctl start nginx

Затем создаем виртуальный домен:

vi /etc/nginx/conf.d/autodiscover.conf

server {
listen 443;
server_name autodiscover.remontka.com;
root /usr/share/nginx/html/autodiscover;

ssl on;
ssl_certificate /etc/letsencrypt/live/remontka.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/remontka.com/privkey.pem;

error_page 405 =200 $uri;
}

* данная настройка позволит нашему серверу nginx принимать запросы на 443 порту (https); в качестве домашней директории мы будем использовать каталог /usr/share/nginx/html/autodiscover , куда и поместим нужный нам XML; /etc/letsencrypt/live/remontka.com/cert.pem и /etc/letsencrypt/live/remontka.com/privkey.pem — пути до сертификатов (в данном примере я использовал сертификаты от Let’s encrypt — чтобы их получить, читайте статью Получение бесплатного SSL сертификата Let’s Encrypt ). Так как NGINX запрещает POST-запросы к статическим файлам, возвращая ошибку 405 , мы будем ее игнорировать, заменяя кодом 200 .

Проверяем корректность настройки:

nginx -t

Если ошибок нет, перечитываем конфиг:

systemctl reload nginx

Создаем каталог, в котором будет наш XML:

mkdir -p /usr/share/nginx/html/autodiscover/autodiscover

Создадим сам XML:

vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.xml

<?xml version=»1.0″ encoding=»UTF-8″?>
<Autodiscover >
<Response >
<User>
<DisplayName>remontka.com</DisplayName>
</User>
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server>imap.remontka.com</Server>
<Port>993</Port>
<LoginName>info@remontka.com</LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<Encryption>SSL</Encryption>
</Protocol>
<Protocol>
<Type>POP</Type>
<Server>pop.remontka.com</Server>
<Port>995</Port>
<LoginName>info@remontka.com</LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<Encryption>SSL</Encryption>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server>smtp.remontka.com</Server>
<Port>587</Port>
<LoginName>info@remontka.com</LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<Encryption>TLS</Encryption>
</Protocol>
</Account>
</Response>
</Autodiscover>

* где из основных параметров на нужны:

  • Type — тип протокола, используя который мы будем подключаться к почтовой системе.
  • Server — сервер для подключения. Для каждого типа протокола может быть задан свой сервер или один и тот же.
  • Port — порт, на котором слушает сервис. Как правило, для
    • IMAP : 143, 993.
    • POP : 110, 995.
    • SMTP : 25, 465, 587.
  • LoginName — логин, который используется для авторизации. Как правило, соответствует адресу электронной почты.
  • AuthRequired — требование проверки подлинности пользователя для подключения к сервису.
  • DomainRequired — требование использования домена для логина авторизации. Необходим, если сервер обслуживает мультидоменную систему.
  • SPA — безопасная проверка пароля.
  • SSL — использование SSL. Для портов 465, 993, 995.
  • Encryption — тип шифрования: SSL или TLS.

Открываем браузер и переходим по адресу https://autodiscover.remontka.com/autodiscover/autodiscover.xml , где вместо remontka.com должен быть Ваш домен. Мы должны увидеть наш XML.

Теперь открываем MS Outlook и получаем автоматически настройки для info@remontka.com.

Все адреса

Наш файл конфигурации рассчитан только на настройку одного адреса. Теперь нужно настроить его на обслуживание любого email. Для этого необходимо написать скрипт, например, на php и немного донастроить сервер.

PHP и php-fpm

Установим php и php-fpm, после разрешаем автозапуск php-fpm и стартуем его:

а) если сервер под CentOS / Red Hat :

yum install php php-fpm

systemctl enable php-fpm

systemctl start php-fpm

б) если сервер под Debian / Ubuntu :

apt-get install php php-fpm

systemctl enable php7.2-fpm

systemctl start php7.2-fpm

* где 7.2 — версия установленной php (проверяется командой php -v ).

Настроим php-fpm

а) если сервер под CentOS / Red Hat :

vi /etc/php-fpm.d/www.conf


listen = /var/run/php-fpm/php-fpm.sock

systemctl restart php-fpm

б) если сервер под Debian / Ubuntu :

vi /etc/php/7.2/fpm/pool.d/www.conf


listen = /var/run/php-fpm/php-fpm.sock

systemctl restart php7.2-fpm

NGINX

Внесем настройки в наш виртуальный домен:

vi /etc/nginx/conf.d/autodiscover.conf


error_page 405 =200 $uri;

location ~ .php$ {
set $root_path /usr/share/nginx/html/autodiscover;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}

* мы добавили обработку скриптов php с помощью php-fpm.

Перезапускаем наш сервер:

systemctl reload nginx

Готовим скрипт

Создадим скрипт php:

vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.php

<?php
//get raw POST data so we can extract the email address
$data = file_get_contents(«php://input»);
preg_match(«/<EMailAddress>(.*?)</EMailAddress>/», $data, $matches);

//set Content-Type
header(«Content-Type: application/xml»);
?>
<?php echo ‘<?xml version=»1.0″ encoding=»utf-8″ ?>’; ?>
<Autodiscover >
<Response >
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server>imap.remontka.com</Server>
<Port>993</Port>
<LoginName><?php echo $matches[1]; ?></LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<Encryption>SSL</Encryption>
</Protocol>
<Protocol>
<Type>POP3</Type>
<Server>imap.remontka.com</Server>
<Port>995</Port>
<LoginName><?php echo $matches[1]; ?></LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<Encryption>SSL</Encryption>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server>imap.remontka.com</Server>
<Port>587</Port>
<LoginName><?php echo $matches[1]; ?></LoginName>
<AuthRequired>on</AuthRequired>
<DomainRequired>on</DomainRequired>
<SPA>on</SPA>
<SSL>on</SSL>
<SMTPLast>on</SMTPLast>
<Encryption>TLS</Encryption>
</Protocol>
</Account>
</Response>
</Autodiscover>

Открываем браузер и переходим по адресу https://autodiscover.remontka.com/autodiscover/autodiscover.php — должен загрузиться XML-документ. В тегах LoginName должно быть пусто.

Переадресация с xml на php

Теперь настроим, чтобы наш веб-сервер переводил запросы xml на наш скрипт php. Открываем настройку нашего виртуального домена:

vi /etc/nginx/conf.d/autodiscover.conf

… и добавим:


location = /autodiscover/autodiscover.xml {
rewrite ^/autodiscover/autodiscover.xml$ /autodiscover/autodiscover.php;
}

Перезапускаем nginx:

systemctl reload nginx

Открываем браузер и переходим по адресу https://autodiscover.remontka.com/autodiscover/autodiscover.xml — должен загрузиться XML-документ. В тегах LoginName должно быть пусто. Значит перенаправление сработало.

Теперь можно открывать Outlook и проверять автонастройку для других почтовых ящиков.

3. Mozilla Thunderbird

Механизм автонастройки от Mozilla похож на Microsoft. Необходимые настройки должны отдаваться веб-сервером в виде XML-документа. Однако запрос не https, а http; и не POST, а GET. Также обращение идет сначала в формате server.domain/mail/config-v1.1.xml?emailaddress=user@server.domain , и если ответ не будет получен — autoconfig.server.domain/mail/config-v1.1.xml?emailaddress=user@server.domain .

Также, как с Outlook, необходимо настроить DNS и веб-сервер.

DNS

создаем А-запись (или CNAME). Пример в bind:

autoconfig IN A 111.111.111.111

* где 111.111.111.111 — IP-адрес на наш веб-сервер, который будет возвращать документ XML.

Веб-сервер

Настраивая autodiscovery для Microsoft, мы уже настроили веб-сервер NGINX. Теперь нужно добавить виртуальный домен и создать соответствующий документ.

Откроем уже созданный нами файл конфигурации:

vi /etc/nginx/conf.d/autodiscover.conf

… и добавим в него:

server {
listen 80;
server_name autoconfig.remontka.com;
root /usr/share/nginx/html/autodiscover;
}

Создаем каталог для хранения XML:

mkdir -p /usr/share/nginx/html/autodiscover/mail

Создаем документ:

vi /usr/share/nginx/html/autodiscover/mail/config-v1.1.xml

<?xml version=»1.0″ encoding=»UTF-8″?>
<clientConfig version=»1.1″>
<emailProvider id=»remontka.com»>
<domain>remontka.com</domain>
<displayName>Почта remontka.com</displayName>
<displayShortName>remontka.com</displayShortName>
<incomingServer type=»imap»>
<hostname>imap.remontka.com</hostname>
<port>143</port>
<socketType>STARTTLS</socketType>
<authentication>password-cleartext</authentication>
<username>%EMAILADDRESS%</username>
</incomingServer>
<incomingServer type=»pop»>
<hostname>pop.remontka.com</hostname>
<port>995</port>
<socketType>SSL</socketType>
<authentication>password-cleartext</authentication>
<username>%EMAILADDRESS%</username>
</incomingServer>
<outgoingServer type=»smtp»>
<hostname>smtp.remontka.com</hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<authentication>password-cleartext</authentication>
<username>%EMAILADDRESS%</username>
</outgoingServer>
</emailProvider>
</clientConfig>

* где:

  • hostname — имя сервера для подключения. Для каждого типа протокола может быть задан свой сервер или один и тот же.
  • port — порт, на котором слушает сервис. Как правило, для
    • IMAP : 143, 993.
    • POP : 110, 995.
    • SMTP : 25, 465, 587.
  • socketType — способ обмена данными. Возможны варианты:
    • plain — без шифрования.
    • SSL — SSL или TLS шифрование на отдельном порту (465, 993, 995).
    • STARTTLS — TLS шифрование через STARTTLS на обычном порту.
  • authentication — метод аутентификации.
  • username — логин для входа. Принимается переменная %EMAILADDRESS%, которая подставляется из запроса, который делает почтовый клиент.

4. DNS SRV

Это метод, призванный быть универсальным. Более того, он описан стандартом RFC.

Суть заключается в создании SRV-записей в DNS. Данная запись создается по следующему синтаксису.

Имя записи:

_<имя службы>._<протокол>

Значение:

<приоритет> <вес> <порт> <хост>

* где:

  • <имя службы> — имя сервиса (например, imap).
  • <протокол> — сетевой протокол (TCP, UDP, TLS).
  • <приоритет> — порядок, в котором идет учет строки.
  • <вес> — если приоритеты совпадают у служб, порядок определяется по их весу.
  • <порт> — порт, на котором слушает служба.
  • <хост> — имя сервера, на который будет вести запись.

Пример записей для настройки почты:

Запись Приоритет Вес Порт Хост Описание
_submission._tcp 10 10 25 smtp.remontka.com. Протокол для отправки почты на другие серверы.
_pop3._tcp 10 10 110 pop.remontka.com. Загрузка почты с сервера.
_imap._tcp 10 10 143 imap.remontka.com. Работа с почтой на удаленном сервере.
_submissions._tcp 30 10 465 smtp.remontka.com. Отправки почты с защитой соединения.
_submission._tcp 20 10 587 smtp.remontka.com. Отправки почты с защитой соединения.
_imaps._tcp 20 10 993 imap.remontka.com. Работа с почтой с защитой соединения.
_pop3s._tcp 20 10 995 pop.remontka.com. Загрузка почты с защитой соединения.

* в данном примере мы отдаем приоритет более защищенным средствам подключения (smtps, imaps, pop3s).

Пример записей в DNS Bind:

_submission._tcp IN SRV 30 0 25 smtp.remontka.com.
_submission._tcp IN SRV 20 0 587 smtp.remontka.com.
_submissions._tcp IN SRV 10 0 465 smtp.remontka.com.
_imap._tcp IN SRV 20 0 143 imap.remontka.com.
_imaps._tcp IN SRV 10 0 993 imap.remontka.com.
_pop3._tcp IN SRV 20 0 110 pop.remontka.com.
_pop3s._tcp IN SRV 10 0 995 pop.remontka.com.

EnglishRussianUkrainian