Мы рассмотрим, как программно отправлять электронные письма из 1С:Предприятия, используя стандартные объекты платформы. Часто разработчики сталкиваются с ошибками подключения или аутентификации, такими как 421 SMTP connection broken или 535 Authentication failed. Разберем основные шаги, правильную настройку почтового профиля и методы устранения распространенных проблем.
ИнтернетПочтовыйПрофиль и ИнтернетПочтаЭто основной и наиболее распространенный метод для отправки электронных писем из 1С.
Настройка почтового профиля (ИнтернетПочтовыйПрофиль):
Создадим новый объект ИнтернетПочтовыйПрофиль и зададим ему необходимые параметры для подключения к SMTP-серверу:
Укажите SMTP-сервер: например, Профиль.АдресСервераSMTP = "smtp.mail.ru";. Аналогично для Яндекс.Почты это будет smtp.yandex.ru, для Gmail – smtp.gmail.com.
Укажите порт SMTP: Профиль.ПортSMTP = 465;. Это стандартный порт для защищенного соединения с использованием SSL/TLS.
Обязательно включите использование SSL/TLS: Профиль.ИспользоватьSSLSMTP = Истина;. Этот шаг критически важен для большинства современных почтовых серверов, так как он обеспечивает шифрование передаваемых данных.
Задайте данные для аутентификации: Профиль.ПользовательSMTP = "ваша_почта@mail.ru"; и Профиль.ПарольSMTP = "ваш_пароль";. Обращаем ваше внимание, что для Gmail и некоторых других сервисов может потребоваться использование специального пароля приложения, а не основного пароля от вашей учетной записи.
Укажите метод аутентификации: Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;. Это один из наиболее распространенных способов аутентификации на SMTP-сервере.
Совет: Если ваша задача заключается только в отправке писем, нет необходимости указывать параметры для получения почты (POP3/IMAP), такие как Профиль.АдресСервераPOP3, Профиль.ПортPOP3 или Профиль.ИспользоватьSSLPOP3. Это упростит код и поможет избежать потенциальных ошибок, связанных с настройкой получения почты.
Создание и отправка почтового сообщения (ИнтернетПочтовоеСообщение):
Создайте новый объект ИнтернетПочтовоеСообщение.
Укажите тему письма: Письмо.Тема = "Тема вашего письма";.
Задайте отправителя: Письмо.Отправитель = "ваш_email@mail.ru"; и имя отправителя: Письмо.ИмяОтправителя = "Ваше Имя";. Важно, чтобы адрес отправителя совпадал с ПользовательSMTP.
Добавьте получателей: Письмо.Получатели.Добавить("получатель@example.com");. Вы можете добавить несколько получателей.
Добавьте текст сообщения: Письмо.Тексты.Добавить("Привет! Это тело письма.", ТипТекстаПочтовогоСообщения.ПростойТекст);. Вы также можете использовать HTML-формат для более сложного оформления: Письмо.Тексты.Добавить("<h3>Заголовок</h3><p>Текст в HTML формате</p>", ТипТекстаПочтовогоСообщения.HTML);.
При необходимости добавьте вложения (подробнее об этом ниже).
Установление соединения и отправка:
Создайте объект ИнтернетПочта.
Попытайтесь подключиться к почтовому серверу, используя настроенный профиль, методом Почта.Подключиться(Профиль).
В случае успешного подключения, отправьте подготовленное сообщение методом Почта.Послать(Письмо).
После отправки письма обязательно отключитесь от сервера с помощью Почта.Отключиться().
Обязательно используйте блоки Попытка...Исключение для обработки возможных ошибок при подключении и отправке, чтобы ваше приложение могло корректно реагировать на проблемы и предоставлять информативные сообщения пользователю.
Рассмотрим пример полного кода, собранный из обсуждений на форуме и дополненный для наглядности:
// Создаем объект почтового профиля
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Настройка SMTP-сервера Mail.ru (пример)
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465; // Стандартный порт для SSL/TLS
Профиль.ИспользоватьSSLSMTP = Истина; // Обязательно для защищенного соединения
// Данные для аутентификации
Профиль.ПользовательSMTP = "al-vi06@mail.ru"; // Замените на ваш фактический адрес электронной почты
Профиль.ПарольSMTP = "ВАШ_ПАРОЛЬ_ИЛИ_ПАРОЛЬ_ПРИЛОЖЕНИЯ"; // Замените на ваш пароль (для Gmail, Yandex, Mail.ru может потребоваться пароль приложения)
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина; // Может потребоваться для некоторых почтовых серверов
// Создаем почтовое сообщение
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Пробное письмо из 1С";
Письмо.Отправитель = "al-vi06@mail.ru"; // Должен совпадать с Профиль.ПользовательSMTP
Письмо.ИмяОтправителя = "Ваше Имя"; // Произвольное имя отправителя
Письмо.Получатели.Добавить("получатель@example.com"); // Замените на адрес получателя
// Добавление текста письма
ТекстПисьма = "Привет! Это пробное письмо, отправленное из 1С:Предприятия.
|Надеемся, оно дошло успешно.
|С уважением,
|Ваш отправитель.";
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
// Пример добавления HTML-текста (вместо простого текста или в дополнение)
// HTMLТекст = "<p>Здравствуйте!</p>
// |<p>Это <b>HTML</b>-письмо из 1С.</p>
// |<p>С уважением, <i>Автоматика</i></p>";
// Письмо.Тексты.Добавить(HTMLТекст, ТипТекстаПочтовогоСообщения.HTML);
// Пример добавления вложений (закомментировано, активируйте при необходимости)
// ПутьКФайлуВложения = "C:\МоиДокументы\Отчет.pdf"; // Укажите полный путь к файлу на сервере или клиенте
// Если ФайлСуществует(ПутьКФайлуВложения) Тогда
// Письмо.Вложения.Добавить(ПутьКФайлуВложения);
// Сообщить("Вложение добавлено: " + ПутьКФайлуВложения);
// Иначе
// Сообщить("Ошибка: Файл вложения не найден по пути: " + ПутьКФайлуВложения);
// КонецЕсли;
// Создаем объект для работы с почтой
Почта = Новый ИнтернетПочта;
Попытка
// Подключаемся к почтовому серверу
Почта.Подключиться(Профиль);
Сообщить("Подключено к почтовому серверу: " + Профиль.АдресСервераSMTP);
// Отправляем письмо
Почта.Послать(Письмо);
Сообщить("Письмо успешно отправлено.");
Исключение
// Обработка ошибок при подключении или отправке
Сообщить("Не удалось отправить письмо.");
Сообщить("Описание ошибки: " + ОписаниеОшибки());
КонецПопытки;
// Отключаемся от почтового сервера
Почта.Отключиться();
Сообщить("Соединение с почтовым сервером завершено.");
Важно: Мы должны убедиться, что для вашего почтового аккаунта на сайте провайдера (Mail.ru, Yandex, Gmail) разрешен доступ по протоколу POP3/IMAP/SMTP для почтовых клиентов. Это часто требует отдельной настройки в личном кабинете пользователя почтового сервиса (как указано в сообщении 17).
Мы проанализируем наиболее частые ошибки, с которыми сталкиваются пользователи при программной отправке писем, и выясним пути их устранения.
Ошибка 421 SMTP connection broken (reply) или SMTP greeting failure:
Причина: Эта ошибка часто указывает на проблемы с сетевым подключением, блокировку порта брандмауэром или антивирусом, либо некорректные настройки SSL/TLS. Сервер не может установить начальное соединение или "приветствие".
Решение:
Проверьте настройки SSL/TLS: Убедитесь, что в вашем коде установлено Профиль.ИспользоватьSSLSMTP = Истина;. Это критически важно для установления защищенного соединения.
Проверьте порт: Убедитесь, что используете правильный порт SMTP (обычно 465 для SSL/TLS или 587 для STARTTLS, который также требует включения SSL/TLS в 1С).
Брандмауэр и антивирус: Проверьте настройки брандмауэра на сервере 1С или клиентской машине, с которой осуществляется отправка. Убедитесь, что исходящие соединения по используемому порту (например, 465 или 587) не блокируются. Временное отключение антивируса или добавление 1С в исключения может помочь в диагностике.
Сетевое подключение: Убедитесь, что сервер 1С имеет стабильное подключение к интернету и может "достучаться" до SMTP-сервера. Если вы используете прокси-сервер, могут потребоваться дополнительные настройки для работы почты через него.
Ошибка 535 Authentication failed. Please verify your account...:
Причина: Это ошибка аутентификации. SMTP-сервер отклоняет попытку входа, потому что логин или пароль неверны.
Решение:
Проверьте логин и пароль: Внимательно проверьте значения, указанные в Профиль.ПользовательSMTP и Профиль.ПарольSMTP. Убедитесь в отсутствии опечаток.
Пароли приложений (для Gmail, Yandex, Mail.ru): Для усиления безопасности многие крупные почтовые сервисы требуют использования специальных паролей приложений для сторонних клиентов (вместо основного пароля от вашей учетной записи). Сгенерируйте такой пароль в настройках безопасности вашего аккаунта (например, "Пароли приложений" в Google, "Внешний доступ" в Mail.ru, "Пароли для внешних приложений" в Yandex) и используйте его вместо основного пароля.
Разрешение доступа по SMTP: Убедитесь, что в настройках вашей почтовой учетной записи на сайте провайдера явно разрешен доступ по протоколу SMTP для сторонних приложений. Это критически важный шаг, о котором упоминается в сообщении 17.
Аутентификация SMTP: Обычно СпособSMTPАутентификации.Login является наиболее подходящим. В некоторых случаях, например, при использовании Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина;, сервер может требовать более строгих условий аутентификации.
Ошибка 550 Recipient address rejected / user not found:
Причина: Адрес получателя письма не существует или является недействительным. Почтовый сервер получателя отклоняет письмо, указывая на проблему с адресатом.
Решение:
Проверка адреса: Убедитесь, что адрес получателя указан корректно. Это самая простая проверка.
Валидация email-адресов: Мы подробно рассмотрим этот вопрос ниже. Регулярная отправка писем на несуществующие адреса может привести к ухудшению репутации вашего почтового домена и попаданию в черные списки почтовых провайдеров, что усложнит доставку даже валидных писем (сообщение 11).
Мы разберем, как добавлять файлы к отправляемым письмам, что является частой потребностью при автоматической отправке документов или отчетов.
Для добавления вложений используйте метод Письмо.Вложения.Добавить(). Укажите полный путь к файлу. Метод принимает путь к файлу в виде строки.
Рассмотрим пример, показывающий добавление нескольких вложений, в том числе с обработкой возможных ошибок (адаптировано из сообщения 6):
// Предположим, у нас есть несколько файлов для вложения
ИмяФайла1 = "C:\Путь\К\Файлу\Вложение1.pdf";
ИмяФайла2 = "C:\Путь\К\Файлу\Вложение2.docx";
ИмяФайла3 = "C:\Путь\К\Файлу\Вложение3.xlsx";
// Добавляем первое вложение
Если ФайлСуществует(ИмяФайла1) Тогда
Письмо.Вложения.Добавить(ИмяФайла1);
Сообщить("Вложение успешно добавлено: " + ИмяФайла1);
Иначе
Сообщить("Предупреждение: Файл вложения не найден: " + ИмяФайла1);
КонецЕсли;
// Добавляем второе вложение
Если ФайлСуществует(ИмяФайла2) Тогда
Письмо.Вложения.Добавить(ИмяФайла2);
Сообщить("Вложение успешно добавлено: " + ИмяФайла2);
Иначе
Сообщить("Предупреждение: Файл вложения не найден: " + ИмяФайла2);
КонецЕсли;
// Попытка добавить третье вложение с обработкой исключения
Попытка
Если ФайлСуществует(ИмяФайла3) Тогда
Письмо.Вложения.Добавить(ИмяФайла3);
Сообщить("Вложение успешно добавлено: " + ИмяФайла3);
Иначе
ВызватьИсключение "Файл вложения не найден: " + ИмяФайла3;
КонецЕсли;
Исключение
Сообщить("Ошибка при добавлении вложения: " + ОписаниеОшибки());
КонецПопытки;
Важно: Мы должны обеспечить доступность файла, который вы хотите прикрепить, из контекста выполнения 1С. Если 1С работает на сервере, файл должен быть расположен на этом сервере или доступен по сетевому пути (UNC-путь).
Мы рассмотрим, почему так важно проверять корректность email-адресов получателей и какие существуют методы валидации. Отправка писем на некорректные или несуществующие адреса может привести к серьезным проблемам: ухудшению репутации вашего домена, попаданию в черные списки почтовых провайдеров и, как следствие, проблемам с доставкой даже валидных писем (сообщение 11).
Синтаксическая проверка формата адреса:
Этот метод позволяет проверить, соответствует ли адрес общепринятому формату email (например, user@domain.com). Он отсеивает очевидно неправильные адреса.
В стандартных библиотеках 1С (БСП) часто присутствует функция для такой проверки. Например, в УТ 11, как упоминается в сообщении 12, мы можем использовать:
Если Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ВашЕмайл, Ложь) Тогда
Сообщить("Адрес электронной почты '" + ВашЕмайл + "' не соответствует требованиям формата.");
Возврат;
КонецЕсли;
Хотя эта проверка полезна, она не гарантирует, что почтовый ящик по указанному адресу действительно существует и активен.
Проверка существования почтового ящика (верификация):
Как было отмечено в сообщении 13, 100% проверку существования ящика без отправки письма или использования платных сервисов сложно реализовать. Почтовые серверы часто возвращают ошибки типа 550 user terminated или 550 user not found только при попытке реальной доставки письма.
Наиболее надежный метод — подтверждение через отправку кода: Этот подход, предложенный в сообщении 14, является золотым стандартом в веб-сервисах.
При регистрации нового клиента или первом добавлении email-адреса, мы отправляем на него письмо с уникальным кодом подтверждения.
Предлагаем пользователю ввести этот код на сайте или в приложении 1С для завершения регистрации/активации адреса.
Этот метод гарантирует, что адрес не только корректен синтаксически, но и активен, а его владелец имеет к нему доступ. Таким образом, мы избегаем отправки писем на "мертвые" адреса и поддерживаем хорошую репутацию вашего почтового домена (сообщение 21).
Вместо жесткого кодирования параметров почты непосредственно в коде, мы можем значительно повысить гибкость и удобство управления, если будем получать эти настройки из стандартных учетных записей электронной почты, предусмотренных в вашей конфигурации 1С (как показано в сообщении 6).
Во многих типовых конфигурациях 1С (например, 1С:Управление торговлей, 1С:Комплексная автоматизация) существуют специализированные справочники или регистры для хранения учетных записей электронной почты. Получение настроек из них позволяет пользователям самостоятельно управлять параметрами почты без участия программиста.
Рассмотрим пример получения профиля из учетной записи, характерный для типовых конфигураций 1С (адаптировано из сообщения 6):
// Получаем текущего пользователя системы.
// В зависимости от контекста это может быть глЗначениеПеременной("глТекущийПользователь")
// или другой метод получения пользователя.
ТекПользователь = Пользователи.ТекущийПользователь();
// Создаем запрос для получения основной учетной записи электронной почты пользователя.
// Настройки обычно хранятся в регистре сведений "НастройкиПользователей".
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НастройкиПользователей.Значение КАК УчетнаяЗапись
|ИЗ
| РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
|ГДЕ
| НастройкиПользователей.Пользователь = &Пользователь
| И НастройкиПользователей.Настройка = &Настройка";
Запрос.УстановитьПараметр("Пользователь", ТекПользователь);
// Предполагаем, что существует предопределенное значение "ОсновнаяУчетнаяЗапись"
// в ПланеВидовХарактеристик.НастройкиПользователей
Запрос.УстановитьПараметр("Настройка", ПланыВидовХарактеристик.НастройкиПользователей.ОсновнаяУчетнаяЗапись);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
// Получаем ссылку на объект "УчетнаяЗаписьЭлектроннойПочты"
УчетнаяЗапись = Выборка.УчетнаяЗапись;
// Используем типовую функцию для получения ИнтернетПочтовогоПрофиля из учетной записи
Профиль = УправлениеЭлектроннойПочтой.ПолучитьИнтернетПочтовыйПрофиль(УчетнаяЗапись);
Сообщить("Почтовый профиль успешно получен из учетной записи.");
Иначе
Сообщить("Не установлена основная учетная запись электронной почты для текущего пользователя.");
Возврат; // Или сгенерировать исключение, или использовать профиль по умолчанию
КонецЕсли;
// Далее мы можем использовать полученный объект Профиль для отправки письма,
// как было описано в разделе "Стандартный подход 1С:Предприятия".
// Например:
// Почта = Новый ИнтернетПочта;
// Почта.Подключиться(Профиль);
// ...
Примечание: Как было справедливо отмечено в сообщении 7, функция УправлениеЭлектроннойПочтой.ПолучитьИнтернетПочтовыйПрофиль является частью БСП (Библиотеки стандартных подсистем) и может отсутствовать в некоторых конфигурациях (например, в 1С:Управление нашей фирмой). В таких случаях вам придется вручную формировать объект ИнтернетПочтовыйПрофиль, считывая параметры из собственного регистра или справочника, где хранятся настройки почты.
Мы также можем рассмотреть альтернативный подход, который может предоставить дополнительную гибкость или быть предпочтительным в некоторых специфических сценариях — использование COM-объектов, в частности, CDO.Message, как показано в сообщении 15. Этот метод требует наличия и регистрации соответствующих библиотек COM на машине, где выполняется код.
При использовании CDO.Message мы взаимодействуем с системными компонентами Windows для отправки почты. Это может быть полезно в средах, где стандартные объекты 1С работают некорректно или когда требуется более тонкая настройка, не предоставляемая стандартными объектами.
Рассмотрим пример кода с использованием CDO.Message для отправки письма (адаптировано из сообщения 15):
// Создаем объекты CDO
loConfig = Новый COMОбъект("CDO.Configuration");
loCdoMessage = Новый COMОбъект("CDO.Message");
// Параметры почтового сервера (предполагаем, что они хранятся в Константах)
ОправительПочты = Константы.ПочтаНашАдрес.Получить(); // Ваш адрес email
СерверСМТП = Константы.СерверSMTP.Получить(); // SMTP сервер (например, "smtp.gmail.com")
ПортПочтыИсх = СокрЛП(Константы.ПортПочтыИсх.Получить()); // Порт SMTP (например, "465")
ПользовательПочты = Константы.ПочтаПользователь.Получить(); // Логин для SMTP
ПарольПочты = Константы.ПочтаПароль.Получить(); // Пароль для SMTP
// Получатели. Разбираем строку получателей, разделенных запятой.
ПолучательСтрока = СокрЛП(Контрагент.Емайл); // Например, из реквизита контрагента
ПолучательСтрока = СтрЗаменить(ПолучательСтрока, " ", ""); // Удаляем пробелы
МассивПолучателей = Новый Массив;
Если СтрЧислоВхождений(ПолучательСтрока,",") > 0 Тогда
МассивПолучателей = СтрРазделить(ПолучательСтрока, ",", Ложь);
Иначе
МассивПолучателей.Добавить(ПолучательСтрока);
КонецЕсли;
// Настройка полей конфигурации CDO
// Указываем, что будем использовать SMTP-порт
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2; // cdSendUsingPort
// Адрес SMTP-сервера
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = СерверСМТП;
// Порт SMTP-сервера
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = ПортПочтыИсх;
// Метод аутентификации (1 - cdBasicAuth, обычная аутентификация логин/пароль)
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
// Имя пользователя для аутентификации
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = ПользовательПочты;
// Пароль для аутентификации
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = ПарольПочты;
// Использование SSL/TLS (1 - true, 0 - false)
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 1;
// Таймаут соединения в секундах
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
// Обновляем поля конфигурации
loConfig.Fields.Update();
// Привязываем конфигурацию к сообщению
loCdoMessage.Configuration = loConfig;
// Формируем почтовое сообщение
loCdoMessage.Subject = "Тема письма через CDO"; // Тема письма
loCdoMessage.From = ОправительПочты; // Адрес отправителя
// Пример HTML-тела письма
HTMLBody = "<p>Уважаемый клиент,</p>" +
"<p>Это тестовое сообщение, отправленное из 1С с использованием COM-объекта CDO.Message.</p>" +
"<p>=========================================================</p>" +
"<p>С уважением,</p>" +
"<p><i>Ваша компания</i></p>";
loCdoMessage.BodyPart.Charset = "windows-1251"; // Важно для корректного отображения кириллицы
loCdoMessage.HTMLBody = HTMLBody; // Устанавливаем HTML-тело письма
// Пример добавления вложения (закомментировано)
// ПутьСервер = "C:\Путь\К\Файлу\ВложениеДляCDO.pdf";
// Если ФайлСуществует(ПутьСервер) Тогда
// loCdoMessage.AddAttachment(ПутьСервер);
// Иначе
// Сообщить("Предупреждение: Файл вложения для CDO не найден: " + ПутьСервер);
// КонецЕсли;
ПисьмоОтправилосьУспешно = Ложь;
Для Каждого СтрокаМассива Из МассивПолучателей Цикл
Попытка
loCdoMessage.To = СтрокаМассива; // Устанавливаем текущего получателя
loCdoMessage.Send(); // Отправляем письмо
ПредупреждениеТекст = "Письмо успешно отправлено получателю: " + СтрокаМассива;
ПисьмоОтправилосьУспешно = Истина;
Сообщить(ПредупреждениеТекст);
Исключение
ПредупреждениеТекст = "Ошибка отправки письма получателю " + СтрокаМассива + ": " + ОписаниеОшибки();
Сообщить(ПредупреждениеТекст);
ПисьмоОтправилосьУспешно = Ложь;
КонецПопытки;
КонецЦикла;
Если Не ПисьмоОтправилосьУспешно Тогда
Предупреждение("Некоторые или все письма не были отправлены. Проверьте журнал сообщений.");
Иначе
Предупреждение("Все письма были успешно отправлены.");
КонецЕсли;
Важно: При использовании CDO.Message мы должны убедиться, что на операционной системе, где выполняется код 1С, установлены и зарегистрированы необходимые COM-компоненты. Обычно это уже есть в Windows по умолчанию.
Мы детально рассмотрели процесс программной отправки электронных писем из 1С:Предприятия, используя как стандартные объекты платформы (ИнтернетПочтовыйПрофиль, ИнтернетПочта), так и альтернативный метод с CDO.Message. Особое внимание уделили настройке SSL/TLS, устранению распространенных ошибок аутентификации и подключения, а также важности валидации email-адресов получателей для обеспечения надежной доставки и поддержания хорошей репутации отправителя. Следуя этим рекомендациям, мы сможем эффективно автоматизировать отправку корреспонденции из вашей системы 1С.