Многие технические специалисты сталкиваются с ситуацией, когда метод Послать объекта ИнтернетПочта выполняется неоправданно долго — от 20 до 40 секунд на одно простое текстовое письмо. Это создает серьезные неудобства для пользователей, так как в момент отправки интерфейс программы может «зависать», блокируя работу. Разберем подробно, почему это происходит и как оптимизировать процесс взаимодействия 1С с почтовым сервером (чаще всего MS Exchange).
Прежде чем приступать к глубоким настройкам, проанализируем, на каком этапе возникает задержка. Если отправка через внешние сервисы (например, mail.ru или yandex.ru) происходит мгновенно (за 0.5–1 сек), а задержки наблюдаются только с внутренним MS Exchange, проблема кроется в настройках безопасности или протоколах взаимодействия сервера. Рассмотрим простой способ проверки скорости отправки в обход стандартных механизмов платформы с помощью объекта CDO.Message. Это поможет выяснить, виновата ли сама платформа 1С или сетевые настройки.
Функция ОтправитьПисьмоЧерезCDO()
Попытка
CDO = Новый COMОбъект("CDO.Message");
Исключение
Сообщить("Ошибка: объект CDO.Message не создан");
Возврат Ложь;
КонецПопытки;
CDO.From = "sender@company.com";
CDO.To = "receiver@company.com";
CDO.Subject = "Тестовое письмо CDO";
CDO.Textbody = "Текст сообщения";
Item = "http://schemas.microsoft.com/cdo/configuration/sendusing";
CDO.Configuration.Fields.Item(Item).Value = 2; // SMTP
Item = "http://schemas.microsoft.com/cdo/configuration/smtpserver";
CDO.Configuration.Fields.Item(Item).Value = "192.168.1.10"; // IP вашего сервера
Item = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";
CDO.Configuration.Fields.Item(Item).Value = 25;
CDO.Configuration.Fields.Update();
Попытка
Начало = ТекущаяДата();
CDO.Send();
Сообщить("Отправлено за: " + (ТекущаяДата() - Начало) + " сек.");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецФункции
Проанализируем наиболее частую причину задержек при работе с MS Exchange. Сервер по умолчанию применяет защитные механизмы против спама и перегрузок, которые могут воспринимать частые запросы от сервера 1С как подозрительные. Для исправления ситуации необходимо настроить отдельный коннектор получения (Receive Connector) специально для IP-адреса сервера 1С.
Выясним, какие параметры на стороне Exchange влияют на скорость:
Порядок действий для системного администратора:
Receive Connector с типом Custom.Remote Network Settings укажите только IP-адрес сервера 1С.Externally Secured (если серверу 1С можно доверять) или настройте анонимный прием, если 1С отправляет почту без авторизации.
Set-ReceiveConnector "Имя_Коннектора_1С" -TarpitInterval 00:00:00
Set-ReceiveConnector "Имя_Коннектора_1С" -MaxAcknowledgementDelay 00:00:00
Рассмотрим ситуацию, когда 1С долго пытается «достучаться» до сервера. Начиная с версии 8.3.10, платформа активно использует IPv6. Если в вашей сети настроен DNS, который возвращает IPv6-адрес сервера Exchange, но сам сервер или маршрутизаторы работают с ним некорректно, 1С будет ждать таймаута подключения (обычно около 20 секунд), прежде чем переключиться на IPv4.
Что нужно сделать:
УчетныеЗаписиЭлектроннойПочты) укажите вместо DNS-имени сервера его прямой IP-адрес (IPv4). Это исключит лишние запросы к DNS-серверу.Проанализируем изменения в платформе 1С. Начиная с версии 8.3.9, была введена полная поддержка шифрования. Если в настройках учетной записи указано использование защищенного соединения, 1С тратит значительное время на согласование сертификатов и протоколов (Handshake). Иногда платформа пытается использовать STARTTLS даже там, где это не требуется.
Разберем, как принудительно задать параметры в коде для исключения задержек:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "192.168.1.10";
Профиль.ПортSMTP = 25;
// Явное отключение защищенных протоколов для внутренней сети
Профиль.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
// Если используется MS Exchange внутри сети, часто лучше использовать аутентификацию по умолчанию
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.БезАутентификации;
Также замечена интересная особенность: если в учетной записи 1С заполнены настройки для входящей почты (IMAP/POP3), платформа может пытаться проверить соединение с ними при инициализации почтового сеанса. Попробуйте очистить параметры СерверВходящейПочты или установить там localhost, если учетная запись используется только на отправку.
Если после всех настроек время отправки сократилось до 1–3 секунд, но это все равно мешает пользователям при массовой рассылке, рассмотрим архитектурное решение. Вместо того чтобы вызывать метод Послать непосредственно в коде кнопки, следует записывать данные письма в специальный регистр сведений (очередь писем) и отправлять их регламентным заданием в фоновом режиме.
Преимущества такого подхода:
Выясним последовательность действий при возникновении задержек:
yandex.ru). Если там быстро — проблема в локальном сервере или DNS.TarpitInterval и добавьте IP сервера 1С в исключения.CDO.Message через COM-соединение, который работает стабильнее в средах Windows.