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

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: SMTP, POP, IMAP, DNSXML, 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.dmosk.ru.

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

Веб-сервер

В качестве примера, настройку выполним на веб-сервере 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.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.

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

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 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:

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 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. Открываем настройку нашего виртуального домена:

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

... и добавим:

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

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

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

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

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

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

...

server {
    listen       80;
    server_name  autoconfig.dmosk.ru;
    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="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._tcp 10 10 25 smtp.dmosk.ru. Протокол для отправки почты на другие серверы.
_pop3._tcp 10 10 110 pop.dmosk.ru. Загрузка почты с сервера.
_imap._tcp 10 10 143 imap.dmosk.ru. Работа с почтой на удаленном сервере.
_submissions._tcp 30 10 465 smtp.dmosk.ru. Отправки почты с защитой соединения.
_submission._tcp 20 10 587 smtp.dmosk.ru. Отправки почты с защитой соединения.
_imaps._tcp 20 10 993 imap.dmosk.ru. Работа с почтой с защитой соединения.
_pop3s._tcp 20 10 995 pop.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.

# Почта # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку почты

Нужна бесплатная консультация?

Мини-инструкции

Настройка аутентификации Grafana через Active Directory

Использование Roundcube на CentOS для нескольких почтовых серверов

Как настроить доверительные отношения между доменами Active Directory

Настройка Autodiscover для автоматического конфигурирования почтовых программ

Установка и настройка прокси-сервера 3proxy на Ubuntu

Убрать эскизы при наведении мыши в панели задач

Проверка и фильтрация контента входящей почты в Postfix

Другие инструкции

Все статьи

Нужна помощь? Пишите:






Реклама