При реализации механизмов автоматической отправки электронных писем с вложениями из 1С разработчики нередко сталкиваются с ошибкой времени выполнения: «Ошибка при вызове метода контекста (Send): Произошла исключительная ситуация (CDO.Message.1). Транспорту не удалось подключиться к серверу». Часто такая ситуация возникает при смене операционной системы (например, при переходе с Windows 7 на более современные версии Windows) или при отправке через внешние почтовые сервисы (Gmail, Яндекс, Mail.ru).
Разберем детально причины возникновения данной проблемы и рассмотрим надежные варианты ее устранения.
Проанализируем базовый сценарий работы через COM-объект CDO.Message. В исходном коде для подключения к серверу Gmail был указан порт 25:
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = "25";
Стандартный порт 25 предназначен для открытой передачи данных без шифрования и в современных почтовых службах либо полностью закрыт провайдерами для защиты от спама, либо отклоняется самим почтовым сервисом. Для безопасного соединения через SSL/TLS необходимо использовать порт 465 или 587 с обязательным включением шифрования.
Выясним, как правильно настроить поля конфигурации CDO для защищенного соединения:
loConfig = Новый ComОбъект("CDO.Configuration");
loCdoMessage = Новый ComОбъект("CDO.Message");
loCdoMessage.Configuration = loConfig;
// Заполнение полей сообщения
loCdoMessage.From = "myaccount@gmail.com";
loCdoMessage.To = СокрЛП(АдресЭП);
loCdoMessage.Subject = "Дисконтная карта";
loCdoMessage.BodyPart.Charset = "windows-1251";
loCdoMessage.HTMLBody = "<html><body><p>Ваша дисконтная карта во вложении.</p></body></html>";
// Добавление сформированного файла во вложение
loCdoMessage.AddAttachment(ИмяФайла);
// Настройка параметров подключения к SMTP
Схема = "http://schemas.microsoft.com/cdo/configuration/";
loConfig.Fields.Item(Схема + "sendusing").Value = 2; // cdoSendUsingPort
loConfig.Fields.Item(Схема + "smtpserver").Value = "smtp.gmail.com";
loConfig.Fields.Item(Схема + "smtpserverport").Value = 465; // Использование защищенного порта
loConfig.Fields.Item(Схема + "smtpusessl").Value = 1; // Включение SSL
loConfig.Fields.Item(Схема + "smtpauthenticate").Value = 1; // Базовая аутентификация
loConfig.Fields.Item(Схема + "sendusername").Value = "myaccount@gmail.com";
loConfig.Fields.Item(Схема + "sendpassword").Value = "пароль_приложения";
loConfig.Fields.Item(Схема + "smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();
loCdoMessage.Send();
Современные почтовые серверы требуют обязательного использования двухфакторной аутентификации (2FA) и специальных паролей приложений. Передача обычного пароля от учетной записи приводит к блокировке авторизации со стороны сервера.
Разберем по шагам, как настроить доступ:
Обратим внимание на сохранение временного файла. Если формирование файла вложения выполняется кодом вида:
ИмяФайла = КаталогПрограммы() + СокрЛП(Контрагент.Наименование) + ".jpg";
В современных операционных системах папка установки платформы (например, C:\Program Files\1cv8\...) защищена механизмами контроля учетных записей (UAC). Пользователь 1С или служба сервера 1С не имеют прав на запись в эту директорию. В результате файл не создается или оказывается поврежденным, что приводит к ошибкам при его прикреплении.
Для сохранения временных файлов всегда используйте системный временный каталог:
КаталогВременных = КаталогВременныхФайлов();
ИмяФайла = КаталогВременных + "Card_" + СокрЛП(Контрагент.Код) + ".jpg";
Библиотека CDO.Message является устаревшим 32-разрядным COM-объектом Windows. При переходе на 64-разрядный сервер 1С или современные ОС такой механизм может давать сбои из-за отключения старых версий протоколов TLS. Рекомендуется использовать встроенные средства платформы 1С:Предприятие 8 — объекты ИнтернетПочтовыйПрофиль и ИнтернетПочта.
Посмотрим на пример отправки письма штатными средствами 1С:
// 1. Формирование профиля подключения
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.gmail.com";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "myaccount@gmail.com";
Профиль.ПарольSMTP = "пароль_приложения";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.Таймаут = 60;
// 2. Создание почтового сообщения
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.ИмяОтправителя = "Служба поддержки";
Письмо.Отправитель.Адрес = "myaccount@gmail.com";
Письмо.Получатели.Добавить(СокрЛП(АдресЭП));
Письмо.Тема = "Дисконтная карта";
Письмо.Кодировка = "UTF-8";
// Формирование HTML-тела письма
Письмо.Тексты.Добавить("<html><body><p>Здравствуйте! Ваша дисконтная карта во вложении.</p></body></html>", ТипТекстаПочтовогоСообщения.HTML);
// 3. Добавление вложения
Если ФайлСуществует(ИмяФайла) Тогда
Письмо.Вложения.Добавить(ИмяФайла, "ДисконтнаяКарта.jpg");
КонецЕсли;
// 4. Отправка сообщения
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
Почта.Отключиться();
ВызватьИсключение "Ошибка при отправке почты: " + ОписаниеОшибки();
КонецПопытки;
Использование встроенных объектов ИнтернетПочтовыйПрофиль и ИнтернетПочта полностью устраняет зависимость от операционной системы, COM-компонентов и разрядности платформы, обеспечивая стабильную работу почтовых механизмов.