Настройка 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.

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

Да            Нет