При работе с механизмами отправки электронных писем в системе 1С:Предприятие разработчики часто сталкиваются с ошибками протокола SMTP. Одной из самых распространенных и в то же время коварных является ошибка: Ошибка при вызове метода контекста (Послать): Неверный синтаксис команды. Возможно ошибка в написании почтового адреса (SMTP error code 501 5.1.7 Invalid address). На первый взгляд может показаться, что код написан верно, но сервер упорно отказывается принимать сообщение. Давайте разберем эту ситуацию подробно и выясним, как правильно настроить программную отправку почты.
Проанализируем ситуацию, представленную в обсуждении. Разработчик предоставил фрагмент кода, где заполняются свойства объекта ИнтернетПочтовоеСообщение. Рассмотрим внимательно следующую строку:
Сообщение.Отправитель = "mail.inbastion.com";
В этой строке кроется главная проблема. Протокол SMTP при выполнении команды MAIL FROM ожидает увидеть полноценный адрес электронной почты в формате user@domain.com. В приведенном примере вместо адреса почтового ящика указано доменное имя (или имя сервера). Почтовый сервер, получая такую команду, не может идентифицировать отправителя и возвращает ошибку синтаксиса 501 5.1.7.
Выясним причину: сервер воспринимает строку mail.inbastion.com как недопустимую, так как в ней отсутствует обязательный символ «собака» (@) и локальная часть адреса. Для исправления ситуации необходимо указывать полный e-mail, зарегистрированный на данном сервере.
Для того чтобы письмо успешно ушло, мы должны передать в свойство Отправитель корректную строку или специальный объект. Рассмотрим, как должен выглядеть исправленный код:
Сообщение = Новый ИнтернетПочтовоеСообщение;
// ВАЖНО: Указываем полный адрес, а не имя сервера
Сообщение.Отправитель = "info@inbastion.com";
Сообщение.Тема = "ТЕСТ";
Кроме того, хорошим тоном считается использование объекта ИнтернетПочтовыйАдрес. Это позволяет не только передать сам e-mail, но и задать красивое отображаемое имя, которое увидит получатель в поле «От кого».
Разберем пример с использованием этого объекта:
Сообщение = Новый ИнтернетПочтовоеСообщение;
АдресОтправителя = Новый ИнтернетПочтовыйАдрес;
АдресОтправителя.Адрес = "sender@test.ru";
АдресОтправителя.ОтображаемоеИмя = "Робот автоматизации 1С";
Сообщение.Отправитель = АдресОтправителя;
Современные почтовые сервисы (такие как Mail.ru, Gmail, Яндекс.Почта или корпоративные серверы Microsoft Exchange) имеют жесткие политики безопасности. Одной из таких политик является запрет на «спуфинг» (подмену отправителя). Это означает, что адрес, указанный в Сообщение.Отправитель, должен строго совпадать с логином, который используется в объекте ИнтернетПочтовыйПрофиль.
Проанализируем типичную структуру профиля:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.Пользователь = "myaccount@mail.ru"; // Логин
Профиль.Пароль = "password_app";
// В сообщении должен быть этот же адрес!
Сообщение.Отправитель = "myaccount@mail.ru";
Если в профиле указан один адрес, а в объекте сообщения другой, сервер может выдать ошибку 501 или 503, считая, что вы пытаетесь отправить письмо от чужого имени.
Часто адреса электронной почты считываются из справочников, файлов или текстовых полей на форме. В таких случаях в строку могут попасть невидимые символы: пробелы, знаки табуляции или переносы строк (CR/LF). Как было отмечено в обсуждении на форуме, «одинокий перевод строки» вместо адреса — частая причина сбоев.
Посмотрим, как обезопасить свой код. Всегда используйте функцию СокрЛП() при назначении адресов:
// Очищаем адрес от случайных пробелов и переносов
ЧистыйАдрес = СокрЛП(Выборка.ЭлектроннаяПочта);
Сообщение.Получатели.Добавить(ЧистыйАдрес);
Если ваша организация использует Microsoft Exchange, стоит учитывать его специфику. Ошибка 5.1.7 часто возникает, когда сервер ожидает определенный формат обрамления адреса угловыми скобками. 1С формирует команды SMTP автоматически, но если вы вручную добавите скобки в строку адреса, например, <mail@test.ru>, то итоговая команда может превратиться в MAIL FROM: <<mail@test.ru>>, что вызовет синтаксическую ошибку.
Также проверьте следующие моменты в настройках Exchange:
Соберем все рекомендации воедино и создадим надежный шаблон функции для отправки сообщения, который минимизирует риск возникновения ошибки 501.
Процедура ОтправитьПисьмоНадежно()
Почта = Новый ИнтернетПочта;
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Настройки сервера (обычно берутся из константы или справочника)
Профиль.АдресСервераSMTP = "smtp.inbastion.com";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.Пользователь = "robot@inbastion.com";
Профиль.Пароль = "secure_password";
Сообщение = Новый ИнтернетПочтовоеСообщение;
// Используем объект для отправителя
Отправитель = Новый ИнтернетПочтовыйАдрес;
Отправитель.Адрес = СокрЛП(Профиль.Пользователь); // Совпадение с логином!
Отправитель.ОтображаемоеИмя = "Уведомления 1С";
Сообщение.Отправитель = Отправитель;
// Добавление получателя
ПочтаПолучателя = "tech@test.ru";
Сообщение.Получатели.Добавить(СокрЛП(ПочтаПолучателя));
Сообщение.Тема = "Проверка системы";
Сообщение.Тексты.Добавить("Текст сообщения сформирован автоматически.", ТипТекстаПочтовогоСообщения.Текст);
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
// Здесь мы поймаем нашу ошибку 501 5.1.7 и сможем проанализировать её
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Выяснив причину ошибки 501 5.1.7, мы понимаем, что она практически всегда связана с некорректным форматом строки в поле отправителя или получателя. Главное правило: всегда указывайте полный почтовый адрес, очищайте его от пробелов с помощью СокрЛП() и следите за тем, чтобы отправитель соответствовал учетной записи, под которой произведено подключение к SMTP-серверу.