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 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.
"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.
_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
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
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.
....
; 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/
# 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";
}
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
# /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>
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
# /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>
<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>
<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" - добившись тем самым гораздо большей гибкости в конфигурировании.