Тематические термины: SMTP, POP, IMAP, DNS, XML, NGINX.
Разберем процесс создания инфраструктуры для автоматической настройки почтовых клиентов. Для корректной работы Autodiscover нужен комплексный подход, так как у разных почтовых клиентов свои требования.
По имени сервера
Для MS Outlook
Для Mozilla Thunderbird
Через SRV DNS
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-releaseyum install nginxб) если сервер под Debian / Ubuntu:
apt-get install nginxПосле разрешаем автозапуск и стартуем сервис:
systemctl enable nginxsystemctl start nginxЗатем создаем виртуальный домен:
vi /etc/nginx/conf.d/autodiscover.confserver {
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-fpmsystemctl enable php-fpmsystemctl start php-fpmб) если сервер под Debian / Ubuntu:
apt-get install php php-fpmsystemctl enable php7.2-fpmsystemctl 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. |
Источник: https://www.dmosk.ru/miniinstruktions.php?mini=autodiscover-mail
