Настройка Autodiscover для своего почтового сервера
Тематические термины: SMTP, POP, IMAP, DNS, XML, NGINX.
Разберем процесс создания инфраструктуры для автоматической настройки почтовых клиентов. Для корректной работы Autodiscover нужен комплексный подход, так как у разных почтовых клиентов свои требования.
1. Определение по имени сервера
Это самый простой способ для автообнаружения почтового сервера почтовым клиентом. Он заключается в том, что некоторые клиенты ищут сервер по типичным именам, поэтому все, что нам нужно — дать корректное имя нашему почтовику. Как правило, это такие названия:
- relay
Минус в том, что не все почтовые клиенты обладают таким свойством, а также мы не можем задать более сложные настройки.
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.