UMGUM.COM 

Autodiscover mail service ( Описание способов доставки почтовому клиенту параметров сервиса на первичном этапе настройки. )

18 июня 2017

OS: Linux Debian 8 Jessie, Ubuntu 16.04 LTS.
Service: DNS, Apache2, Nginx.
Application: "Mozilla Thunderbird" и "Microsoft Outlook".

На данный момент есть три способа предоставить клиентскому приложению информацию о поддерживаемой сервером электронной почты конфигурации. Один удобный и простой, но фактически неиспользуемый, и два принципиально схожих, но слегка различающихся в реализации способа через загружаемый XML-файл, продвигаемых по раздельности корпорациями Mozilla и Microsoft.

Предположим, у нас три почтовых сервиса: SMTP, IMAP и POP3 (последний я обычно вообще отключаю, но для полноты картины напишем и о нём) - перечисленные в порядке умозрительного приоритета (в самом деле очень важно принять немедленно всю входящую корреспонденцию, потом уже обеспечить работу наиболее удобного протокола с почтой, и уже напоследок поддержать остальное). Далее последовательно разберём настройку всех трёх способов раздачи конфигурации.

Примеры приведены для доменного имени "nsu.ru" (оно фигурирует в адресах почтовых ящиков типа "username@nsu.ru"), где почтовый сервис как таковой функционирует на FQDN "mail.nsu.ru".


Первый способ, чисто DNS-ный, экзотичный, практически неприменимый и реализуемый здесь "just for fun".

Следуя RFC6186 создадим DNS-записи оповещающие о конфигурации нашей почтовой системы. Метод до сих пор в статусе черновика, хотя инициирован довольно давно и даже сотрудником (Cyrus Daboo) компании Apple, что по идее могло бы стать толчком к повсеместному внедрению - но увы, пока этим способом вроде бы никакие распространённые почтовые клиенты не пользуются (разве что на MacOS, но пока мне не на чем проверить).

Создаём SRV-записи, указывающие на почтовые доступные подсистемы, в формате сервера BIND v9:

# SMTP: SSL/TLS
_submission._tcp  SRV 0  1 465 mail.nsu.ru.
# SMTP: StartTLS
_submission._tcp  SRV 5  1 587 mail.nsu.ru.

# IMAP: SSL/TLS
_imaps._tcp       SRV 0  1 993 mail.nsu.ru.
# IMAP: Insecure or StartTLS
_imap._tcp        SRV 10 1 143 mail.nsu.ru.

# POP3: SSL/TLS
_pop3s._tcp       SRV 20 1 995 mail.nsu.ru.
# POP3: Insecure or StartTLS
_pop3._tcp        SRV 30 1 110 mail.nsu.ru.

Где, например:

"_submission._tcp" - тип записи, указывающий на SMTP-сервис,
"0" - (первое число) приоритет сервиса по отношению к другим (чем меньше число, тем выше приоритет),
"1" - (второе число) непонятно что, выставляемое в одинаковое для всех записей значение (weight),
"465" - (третье число) номер порта для SMTPS.

Проверить успешность публикации DNS-записей снаружи можно следующим образом:

$ host -t srv _submission._tcp.nsu.ru.

_submission._tcp.nsu.ru has SRV record 0 1 465 mail.nsu.ru.
_submission._tcp.nsu.ru has SRV record 5 1 587 mail.nsu.ru.

Есть ещё web-сервис, который предоставляет инструменты тестирования через формочки: https://mxtoolbox.com/SuperTool.aspx - поклацав там по ссылкам можно узнать много нового.

Теперь о реально работающих способах.

Как я упоминал выше, корпорации Mozilla и Microsoft используют схожие способы предоставления конфигурации почтовым клиентам через выдачу web-сервером XML-файла по запросу.

Решение для почтового клиента "Mozilla Thunderbird" через HTTP выдаёт XML-файл по GET-запросу к следующим слегка невнятным адресам:

http://autoconfig.nsu.ru/mail/config-v1.1.xml
http://nsu.ru/.well-known/autoconfig/mail/config-v1.1.xml

Подробные инструкции от первоисточника смотреть здесь: https://developer.mozilla.org/en/docs/Mozilla/Thunderbird/Autoconfiguration

Microsoft для своего почтового клиента создала и продвигает протокол автоматической конфигурации через выдаваемый поверх HTTPS XML-файл по POST-запросу к следующим адресам:

https://nsu.ru/autodiscover/autodiscover.xml
https://autodiscover.nsu.ru/autodiscover/autodiscover.xml

На мой взгляд есть смысл объединить, насколько это возможно, функциональность этих двух способов.

Первым делом заводим в доменной зоне "nsu.ru" DNS-записи, указывающие на web-сервер, готовый отдать XML-файлы с описанием конфигураций почтовых клиентов (пример в формате сервера BIND v9):

....
; For "Mozilla Thunderbird"
autoconfig  IN  CNAME  service.nsu.ru.

; For "Microsoft Outlook"
autodiscover        IN  CNAME  service.nsu.ru.
_autodiscover._tcp  SRV 0 0 443 autodiscover.nsu.ru.
....

Далее создаём систему локальных директорий, которая доступна для чтения web-серверу, где разложим XML-файлы с описанием конфигурации.

Для "Mozilla Thunderbird":

# mkdir -p /var/www/autodiscover.nsu.ru/mail/
# mkdir -p /var/www/autodiscover.nsu.ru/.well-known/autoconfig/mail/

Для "Microsoft Outlook":

# mkdir -p /var/www/autodiscover.nsu.ru/autodiscover/

Явно разрешаем чтение данных web-сервером:

# chown www-data:www-data -R /var/www/autodiscover.nsu.ru

Служба автоматического обнаружения настроек у "Mozilla Thunderbird" работает через HTTP, а у "Microsoft Outlook" требует обязательного HTTPS (HTTP у Microsoft может применятся только для специального вида перенаправления, в котором мы не нуждаемся, через описание в XML-файле на защищённый HTTPS узел). Получается, что порт HTTP:80 мы будем использовать только для автоконфигуратора "Mozilla Thunderbird", а порт HTTPS:443 - для почтового клиента Microsoft.

Описываем в Nginx конфигурацию мини-сайтов для выдачи XML-файлов:

# vi /etc/nginx/sites-available/autodiscover.nsu.ru.conf

server {
  listen 80;
  server_name autoconfig.nsu.ru;
  root /var/www/autodiscover.nsu.ru/;
  default_type "text/xml";
}

server {
  listen 443 ssl;
  ssl  on;
  ssl_certificate      /etc/nginx/ssl/wild.nsu.ru.crt;
  ssl_certificate_key  /etc/nginx/ssl/wild.nsu.ru.key;
  ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers  on;
  #
  server_name autodiscover.nsu.ru;
  root /var/www/autodiscover.nsu.ru/;
  default_type "text/xml";
}

Символической ссылкой включаем "виртуальный сервер" в перечень активных и даём команду Nginx перезагрузить настройки:

# ln -s /etc/nginx/sites-available/autodiscover.nsu.ru.conf /etc/nginx/sites-enabled/autodiscover.nsu.ru.conf
# /etc/init.d/nginx reload

Для Apache аналогичная конфигурация выглядит примерно следующим образом:

# vi /etc/apache2/sites-available/autodiscover.nsu.ru.conf

<VirtualHost *:80>
  DocumentRoot /var/www/autodiscover.nsu.ru/
  ServerName autoconfig.nsu.ru
  AddType text/xml .xml
  <Directory /var/www/autodiscover.nsu.ru/>
    Order allow,deny
    allow from all
  </Directory>
</VirtualHost>
<VirtualHost *:443>
  SSLEngine  on
  SSLCertificateFile  /etc/apache2/ssl/wild.nsu.ru.crt
  SSLCertificateKeyFile  /etc/apache2/ssl/wild.nsu.ru.key
  SSLProtocol  all -SSLv2 -SSLv3
  SSLHonorCipherOrder  on
  #
  DocumentRoot /var/www/autodiscover.nsu.ru/
  ServerName autodiscover.nsu.ru
  AddType text/xml .xml
  <Directory /var/www/autodiscover.nsu.ru/>
    Order allow,deny
    allow from all
  </Directory>
</VirtualHost>

Символической ссылкой включаем "виртуальный сервер" в перечень активных и даём команду Apache перезагрузить настройки:

# ln -s /etc/apache2/sites-available/autodiscover.nsu.ru.conf /etc/apache2/sites-enabled/autodiscover.nsu.ru.conf
# /etc/init.d/apache2 reload

Для проверки работоспособности "виртуальных серверов" есть смысл положить в корень сайта web-страничку:

# vi /var/www/autodiscover.nsu.ru/index.html

Autodiscover (Autoconfig) Mail.

Если пробный файл "index.html" успешно загружается, то настройка DNS и web-сервиса прошла успешно - теперь нужно сформировать XML-файлы с набором рекомендаций к настройке почтовых клиентов.

XML-файл с почтовыми настройками для "Mozilla Thunderbird" имеет следующее содержание:

# vi /var/www/autodiscover.nsu.ru/mail/config-v1.1.xml

<?xml version="1.0" encoding="UTF-8"?>
<clientConfig version="1.1">
  <emailProvider id="nsu.ru">
    <domain>nsu.ru</domain>
    <displayName>NSU Mail</displayName>
    <displayShortName>NSU</displayShortName>
    <!-- SMTP: SSL/TLS -->
    <outgoingServer type="smtp">
      <hostname>mail.nsu.ru</hostname>
      <port>465</port>
      <socketType>SSL</socketType>
      <authentication>password-cleartext</authentication>
      <username>%EMAILADDRESS%</username>
    </outgoingServer>
    <!-- SMTP: StartTLS -->
    <outgoingServer type="smtp">
      <hostname>mail.nsu.ru</hostname>
      <port>587</port>
      <socketType>STARTTLS</socketType>
      <authentication>password-encrypted</authentication>
      <username>%EMAILADDRESS%</username>
    </outgoingServer>
    <!-- IMAP: SSL/TLS -->
    <incomingServer type="imap">
      <hostname>mail.nsu.ru</hostname>
      <port>993</port>
      <socketType>SSL</socketType>
      <authentication>password-cleartext</authentication>
      <username>%EMAILADDRESS%</username>
    </incomingServer>
    <!-- IMAP: Insecure or StartTLS -->
    <incomingServer type="imap">
      <hostname>mail.nsu.ru</hostname>
      <port>143</port>
      <socketType>STARTTLS</socketType>
      <authentication>password-encrypted</authentication>
      <username>%EMAILADDRESS%</username>
    </incomingServer>
    <!-- POP3: SSL/TLS -->
    <incomingServer type="pop3">
      <hostname>mail.nsu.ru</hostname>
      <port>995</port>
      <socketType>SSL</socketType>
      <authentication>password-cleartext</authentication>
      <username>%EMAILADDRESS%</username>
    </incomingServer>
    <!-- POP3: Insecure or StartTLS -->
    <incomingServer type="pop3">
      <hostname>mail.nsu.ru</hostname>
      <port>110</port>
      <socketType>STARTTLS</socketType>
      <authentication>password-encrypted</authentication>
      <username>%EMAILADDRESS%</username>
    </incomingServer>
  </emailProvider>
</clientConfig>

XML-файл с почтовыми настройками для "Microsoft Outlook" имеет следующее содержание:

# vi /var/www/autodiscover.nsu.ru/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">
    <Account>
      <AccountType>email</AccountType>
      <Action>settings</Action>
      <!-- SMTP: SSL/TLS -->
      <Protocol>
        <Type>SMTP</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>465</Port>
        <SPA>off</SPA>
        <SSL>on</SSL>
        <AuthRequired>on</AuthRequired>
      </Protocol>
      <!-- SMTP: StartTLS -->
      <Protocol>
        <Type>SMTP</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>587</Port>
        <SPA>off</SPA>
        <Encryption>TLS</Encryption>
        <AuthRequired>on</AuthRequired>
      </Protocol>
      <!-- IMAP: SSL/TLS -->
      <Protocol>
        <Type>IMAP</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>993</Port>
        <SPA>off</SPA>
        <SSL>on</SSL>
        <AuthRequired>on</AuthRequired>
      </Protocol>
      <!-- IMAP: Insecure or StartTLS -->
      <Protocol>
        <Type>IMAP</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>143</Port>
        <SPA>off</SPA>
        <Encryption>TLS</Encryption>
        <AuthRequired>on</AuthRequired>
      </Protocol>
      <!-- POP3: SSL/TLS -->
      <Protocol>
        <Type>POP3</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>995</Port>
        <SPA>off</SPA>
        <SSL>on</SSL>
        <AuthRequired>on</AuthRequired>
      </Protocol>
      <!-- POP3: Insecure or StartTLS -->
      <Protocol>
        <Type>POP3</Type>
        <Server>mail.nsu.ru</Server>
        <DomainName>nsu.ru<DomainName/>
        <DomainRequired>on</DomainRequired>
        <Port>110</Port>
        <SPA>off</SPA>
        <Encryption>TLS</Encryption>
        <AuthRequired>on</AuthRequired>
      </Protocol>
    </Account>
  </Response>
</Autodiscover>

В общем, в самом простом варианте реализации с выдачей статичных XML-файлов конфигураций мы поставленную задачу выполнили. Теперь на этапе первичной настройки почтовых клиентов "Mozilla Thunderbird" и "Microsoft Outlook" таковые будут запрашивать параметры подключения у сервисов автоконфигурирования и следовать им, не требуя от пользователя возни с ручным указанием параметров.

P.S. С подсказкой формата логина есть нюанс. "Microsoft Outlook" при настройке учётной записи "разрезает" указанный почтовый адрес пользователя по символу "@" на "имя" и "домен", оперируя в дальнейшем при авторизации только "именем". Казалось бы использование опции "DomainRequired: on" укажет почтовому клиенту использовать также и "домен" при авторизации, но это не так - в действительности заставить "Microsoft Outlook" использовать логин типа "имя@домен" можно лишь объявив этот самый "домен" в опции "DomainName: nsu.ru".

P.P.S. Как вариант, учитывая то, что запрос XML-файла осуществляется через методы GET и POST протокола HTTP, в наборе переменных которых передаются полные почтовые адреса клиента, в прослойке из CGI-приложения (в роли которого может выступить PHP, Python, Perl или даже BASH) таковые можно вычленить и вставить в параметры "username" или "LoginName" - добившись тем самым гораздо большей гибкости в конфигурировании.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )