При попытке адаптировать современный код отправки почты из платформы 1С:Предприятие 8.3 для работы в устаревшей версии 1С 8.1 разработчики сталкиваются с непреодолимыми синтаксическими и платформенными ограничениями. Разберем причины возникновения таких ошибок, проанализируем ограничения платформы 1С 8.1 и рассмотрим все рабочие варианты организации отправки электронной почты через современные защищенные почтовые сервисы (Yandex, Mail.ru, Gmail).
Посмотрим на типовой пример кода, который отлично работает на платформе 8.3:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ПортSMTP = 587;
Профиль.Таймаут = 15;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательSMTP = "mail@mail.ru";
Профиль.ПользовательIMAP = "mail@mail.ru";
Профиль.ПарольIMAP = "секретный_пароль";
Профиль.ПарольSMTP = "секретный_пароль";
Почта = Новый ИнтернетПочта;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "СООБЩЕНИЕ_ОБМЕНА";
Сообщение.Отправитель = "mail@mail.ru";
Текст = Сообщение.Тексты.Добавить("Привет, мир!");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Сообщение.Получатели.Добавить("recipient@yandex.ru");
Попытка
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину ошибки при запуске подобного кода в 1С 8.1. Встроенный объект ИнтернетПочтовыйПрофиль в версии 8.1 физически не содержит свойств для защищенного соединения, таких как ИспользоватьSSLSMTP, ИспользоватьSSLIMAP, ИспользоватьSSLPOP3, а также свойств для работы по протоколу IMAP (например, АдресСервераIMAP, ПортIMAP). Полноценная поддержка шифрования SSL/TLS и протокола IMAP появилась только в платформе 8.2 (начиная с релиза 8.2.14) и 8.3.
Попытка отключить SSL на стороне почтовых провайдеров (Яндекс, Mail.ru) не увенчается успехом: современные почтовые службы полностью прекратили поддержку открытых незащищенных подключений по протоколам SMTP, POP3 и IMAP в целях безопасности.
Кроме того, если просто запустить конфигурацию на платформе 8.3, но оставить режим совместимости «Версия 8.1», новые свойства и методы все равно будут недоступны, так как платформа будет строго эмулировать синтаксические ограничения версии 8.1.
Разберем подробнее практические способы решения этой проблемы.
Проанализируем наиболее простое и надежное программное решение внутри среды Windows без установки стороннего программного обеспечения. Мы можем задействовать встроенную библиотеку операционной системы CDO (Collaboration Data Objects) через механизм COM-соединения 1С.
Объект CDO.Message умеет самостоятельно устанавливать защищенное соединение по протоколам SSL/TLS. Посмотрим на пример реализации:
Попытка
ПочтовоеСообщение = Новый COMОбъект("CDO.Message");
ПочтоваяКонфигурация = Новый COMОбъект("CDO.Configuration");
ПоляКонфигурации = ПочтоваяКонфигурация.Fields;
Схема = "http://schemas.microsoft.com/cdo/configuration/";
// Настройка параметров SMTP-сервера
ПоляКонфигурации.Item(Схема + "sendusing").Value = 2; // cdoSendUsingPort
ПоляКонфигурации.Item(Схема + "smtpserver").Value = "smtp.yandex.ru";
ПоляКонфигурации.Item(Схема + "smtpserverport").Value = 465; // SSL-порт
ПоляКонфигурации.Item(Схема + "smtpusessl").Value = Истина; // Включение SSL
ПоляКонфигурации.Item(Схема + "smtpauthenticate").Value = 1; // cdoBasic (аутентификация по логину/паролю)
ПоляКонфигурации.Item(Схема + "sendusername").Value = "your_login@yandex.ru";
ПоляКонфигурации.Item(Схема + "sendpassword").Value = "your_app_password";
ПоляКонфигурации.Item(Схема + "smtpconnectiontimeout").Value = 30;
ПоляКонфигурации.Update();
ПочтовоеСообщение.Configuration = ПочтоваяКонфигурация;
ПочтовоеСообщение.From = "your_login@yandex.ru";
ПочтовоеСообщение.To = "recipient@mail.ru";
ПочтовоеСообщение.Subject = "Тема сообщения из 1С 8.1";
ПочтовоеСообщение.TextBody = "Текст письма, отправленного через CDO.Message";
// При необходимости можно добавить вложение:
// ПочтовоеСообщение.AddAttachment("C:\Обмен\файл.zip");
ПочтовоеСообщение.Send();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Не удалось отправить письмо: " + ОписаниеОшибки());
КонецПопытки;
Важно: При использовании современных почтовых сервисов (например, Яндекс или Mail.ru) в качестве пароля необходимо указывать не основной пароль от учетной записи, а специальный пароль приложения, созданный в настройках безопасности почтового ящика.
Если в конфигурации уже написано много кода с использованием стандартного объекта ИнтернетПочта, и переписывать его на COM-объекты нежелательно, рассмотрим вариант с прозрачным шифрованием трафика через утилиту Stunnel.
Разберем принцип работы:
127.0.0.1:25 перенаправляется на smtp.yandex.ru:465.ИнтернетПочтовыйПрофиль в качестве адреса сервера указывается 127.0.0.1, а порт — 25.Рассмотрим долгосрочное решение — обновление технологической платформы с 1С 8.1 на актуальную версию 1С 8.3:
ИнтернетПочтовыйПрофиль и ИнтернетПочта, включая поддержку SSL, TLS и протокола IMAP.Если обновление платформы и использование COM-объектов по каким-либо причинам не подходят, разберем альтернативные варианты:
КомандаСистемы(), передавая отправку почты системным средствам Windows.