При автоматической рассылке отчетов, уведомлений или ошибок обмена из базы «1С:Предприятие 7.7» часто используется популярная внешняя компонента DialMail. Разработчики нередко сталкиваются с ситуацией, когда в почтовом клиенте получателя отображается только голый электронный адрес (например, ivan@ivanov.ru), а не читаемое имя сотрудника или название организации (например, Иван Иванов или Служба оповещения).
Разберем, почему возникает такая задача, какие ошибки могут возникнуть при некорректном указании параметров и как правильно передать отображаемое имя отправителя через методы компоненты DialMail.
Рассмотрим стандартный вызов метода создания почтового сообщения в объекте отправки почты компоненты DialMail:
ОтправкаПочты.СоздатьПисьмо(ОтКого, Кому, СокрЛП(СпрПочта.Копии), "Тема сообщения",, "Текст сообщения...");
Если в первый параметр ОтКого передать исключительно текстовое имя (например, "Отправитель письма" или "Иван Иванов"), процесс отправки завершится ошибкой на этапе общения с почтовым сервером по протоколу SMTP.
Проанализируем лог ошибки, возвращаемый компонентой в этом случае:
Успешно создано письмо. Имя файла созданного письма - A09970BE8F9D8001.msg
Подготовка к отправке сообщений, сообщений в очереди - 1
Успешно подключились к серверу SMTP по адресу - smtp.yandex.ru:465
Полученный от сервера ответ - 235 2.7.0 Authentication successful.
Произошла ошибка. Письмо НЕ отправлено !!!
Последняя ошибка (код): -102
Последняя ошибка (описание): FROM OR SIZE
Последний ответ сервера: 501 5.1.7 Bad address mailbox syntax.
Ответ сервера 501 5.1.7 Bad address mailbox syntax указывает на то, что переданная строка не соответствует стандарту синтаксиса почтового адреса RFC. Сервер ожидает валидный e-mail для формирования SMTP-команды MAIL FROM.
Почтовые стандарты RFC 2822 и RFC 5322 позволяют указывать в поле отправителя одновременно и понятное отображаемое имя, и фактический адрес ящика. Для этого адрес заключается в угловые скобки <...>, а имя указывается перед ним.
Выясним, как правильно сформировать строку для передачи в метод СоздатьПисьмо:
ivan@ivanov.ru).Иван Иванов <ivan@ivanov.ru>.СоздатьПисьмо().Посмотрим на практический пример кода на языке 1С 7.7:
ИмяОтправителя = "Иван Иванов";
ПочтаОтправителя = "ivan@ivanov.ru";
// Формируем поле отправителя по стандарту RFC
ОтКого = СокрЛП(ИмяОтправителя) + " <" + СокрЛП(ПочтаОтправителя) + ">";
Кому = "client@domain.ru";
Копии = "manager@domain.ru";
Тема = "Ошибки обмена в " + СокрЛП(Константа.Магазин.Наименование);
Текст = "Данное письмо сформировано автоматически из базы 1С 7.7...";
// Создаем письмо в объекте DialMail
Если ОтправкаПочты.СоздатьПисьмо(ОтКого, Кому, Копии, Тема,, Текст) = 0 Тогда
Предупреждение("Не удалось сформировать письмо: " + ОтправкаПочты.ПолучитьТекстОшибки());
Возврат;
КонецЕсли;
Разберем ключевые моменты, на которые следует обратить внимание при интеграции отправки почты:
<ivan@ivanov.ru> должен строго совпадать с логином почтового ящика, указанным в настройках SMTP-аутентификации DialMail (либо являться подтвержденным алиасом аккаунта). Если указать чужой адрес, публичные почтовые сервисы отклонят отправку с ошибками доступа или подмены адресата."Иванов, Иван" <ivan@ivanov.ru>.Если по каким-либо причинам использование DialMail невозможно или требуется обойтись без регистрации внешних DLL-библиотек в операционной системе, рассмотрим другие варианты:
CDO.Message свойство From заполняется аналогичным образом:
Письмо = СоздатьОбъект("CDO.Message");
Письмо.From = """Иван Иванов"" <ivan@ivanov.ru>";
Письмо.To = "client@domain.ru";
Письмо.Subject = "Уведомление";
Письмо.TextBody = "Текст сообщения";
КомандаСистемы() или объект WScript.Shell), где параметры адреса и имени отправителя передаются соответствующими ключами запуска.