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

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

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

По имени сервера
Для MS Outlook
Для Mozilla Thunderbird
Через SRV DNS

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.dmosk.ru.

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

Веб-сервер

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

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

Bash
yum install epel-release

Bash
yum install nginx

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

Bash
apt-get install nginx

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

Bash
systemctl enable nginx

Bash
systemctl start nginx

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

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

Nginx
server {
    listen       443;
    server_name  autodiscover.dmosk.ru;
    root /usr/share/nginx/html/autodiscover;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/dmosk.ru/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/dmosk.ru/privkey.pem;

    error_page  405     =200 $uri;
}

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

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

Bash
nginx -t

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

Bash
systemctl reload nginx

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

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

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

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

XML
<?xml version="1.0" encoding="UTF-8"?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
    <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
        <User>
            <DisplayName>dmosk.ru</DisplayName>
        </User>
        <Account>
            <AccountType>email</AccountType>
            <Action>settings</Action>
            <Protocol>
                <Type>IMAP</Type>
                <Server>imap.dmosk.ru</Server>
                <Port>993</Port>
                <LoginName>info@dmosk.ru</LoginName>
                <AuthRequired>on</AuthRequired>
                <DomainRequired>on</DomainRequired>
                <SPA>on</SPA>
                <SSL>on</SSL>
                <Encryption>SSL</Encryption>
            </Protocol>
            <Protocol>
                <Type>POP</Type>
                <Server>pop.dmosk.ru</Server>
                <Port>995</Port>
                <LoginName>info@dmosk.ru</LoginName>
                <AuthRequired>on</AuthRequired>
                <DomainRequired>on</DomainRequired>
                <SPA>on</SPA>
                <SSL>on</SSL>
                <Encryption>SSL</Encryption>
            </Protocol>
            <Protocol>
                <Type>SMTP</Type>
                <Server>smtp.dmosk.ru</Server>
                <Port>587</Port>
                <LoginName>info@dmosk.ru</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.dmosk.ru/autodiscover/autodiscover.xml, где вместо dmosk.ru должен быть Ваш домен. Мы должны увидеть наш XML.

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

Все адреса

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

PHP и php-fpm

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

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

Bash
yum install php php-fpm

Bash
systemctl enable php-fpm

Bash
systemctl start php-fpm

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

Bash
apt-get install php php-fpm

Bash
systemctl enable php7.2-fpm

Bash
systemctl start php7.2-fpm

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

Настроим php-fpm

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

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

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

Bash
systemctl restart php-fpm

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

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

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

systemctl restart php7.2-fpm

NGINX

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

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

Nginx
...
    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.

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

Bash
systemctl reload nginx

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

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

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

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 xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
    <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
        <Account>
            <AccountType>email</AccountType>
            <Action>settings</Action>
            <Protocol>
                <Type>IMAP</Type>
                <Server>imap.dmosk.ru</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.dmosk.ru</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.dmosk.ru</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.dmosk.ru/autodiscover/autodiscover.php — должен загрузиться XML-документ. В тегах LoginName должно быть пусто.

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

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

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

… и добавим:

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

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

Bash
systemctl reload nginx

Открываем браузер и переходим по адресу https://autodiscover.dmosk.ru/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. Теперь нужно добавить виртуальный домен и создать соответствующий документ.

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

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

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

Nginx
...

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

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

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

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

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

XML
<?xml version="1.0" encoding="UTF-8"?>
<clientConfig version="1.1">
        <emailProvider id="dmosk.ru">
                <domain>dmosk.ru</domain>
                <displayName>Почта dmosk.ru</displayName>
                <displayShortName>dmosk.ru</displayShortName>
                <incomingServer type="imap">
                        <hostname>imap.dmosk.ru</hostname>
                        <port>143</port>
                        <socketType>STARTTLS</socketType>
                        <authentication>password-cleartext</authentication>
                        <username>%EMAILADDRESS%</username>
                </incomingServer>
                <incomingServer type="pop">
                        <hostname>pop.dmosk.ru</hostname>
                        <port>995</port>
                        <socketType>SSL</socketType>
                        <authentication>password-cleartext</authentication>
                        <username>%EMAILADDRESS%</username>
                </incomingServer>
                <outgoingServer type="smtp">
                        <hostname>smtp.dmosk.ru</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._tcp101025smtp.dmosk.ru.Протокол для отправки почты на другие серверы.
_pop3._tcp1010110pop.dmosk.ru.Загрузка почты с сервера.
_imap._tcp1010143imap.dmosk.ru.Работа с почтой на удаленном сервере.
_submissions._tcp3010465smtp.dmosk.ru.Отправки почты с защитой соединения.
_submission._tcp2010587smtp.dmosk.ru.Отправки почты с защитой соединения.
_imaps._tcp2010993imap.dmosk.ru.Работа с почтой с защитой соединения.
_pop3s._tcp2010995pop.dmosk.ru.Загрузка почты с защитой соединения.

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

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

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

Источник: https://www.dmosk.ru/miniinstruktions.php?mini=autodiscover-mail

Добавить комментарий