В процессе автоматизации бизнес-процессов часто возникает задача: отправить электронное письмо из 1С так, чтобы получатель увидел в поле "От кого" не технический адрес (например, aaa@mail.ru), а некий официальный или общий адрес компании (например, ccc@mail.ru). При этом техническая отправка должна осуществляться через конкретную учетную запись. Рассмотрим подробнее, почему современные почтовые системы препятствуют такой подмене и какие существуют легальные способы реализации этой задачи.
Для того чтобы разобраться в проблеме, проанализируем ситуацию с точки зрения протокола SMTP. Электронное письмо содержит две разные сущности, определяющие отправителя:
MAIL FROM). Он скрыт от конечного пользователя.В старых версиях протокола можно было указать в поле Header From абсолютно любой адрес. Однако сегодня такая практика практически невозможна при использовании публичных сервисов (Mail.ru, Gmail, Yandex) без предварительной настройки. Выясним причину этого ограничения.
Для борьбы со спамом и фишингом были внедрены технологии проверки подлинности, которые нам необходимо учитывать при разработке в 1С:
ccc@mail.ru с сервера, не авторизованного для этого домена, письмо будет отклонено.Если мы просто программно укажем другой адрес в объекте ИнтернетПочтовоеСообщение, почтовый сервер (например, smtp.mail.ru) при авторизации увидит несоответствие логина и поля From и либо принудительно перезапишет его вашим логином, либо выдаст ошибку авторизации.
Проанализируем ситуацию, упомянутую системным администратором на форуме. Он смог реализовать подмену в Microsoft Outlook. В корпоративной среде (Microsoft Exchange) существует возможность делегирования прав "Send As" (отправить как) или "Send on Behalf" (отправить от имени). Если пользователю aaa даны права отправки от имени ccc, мы можем использовать это в 1С.
Рассмотрим пример кода для реализации этого через COMObject:
// Создаем объект приложения Outlook
OutlookПриложение = Новый COMОбъект("Outlook.Application");
// Создаем новое письмо
Письмо = OutlookПриложение.CreateItem(0);
Письмо.To = "client@example.com";
Письмо.Subject = "Тема сообщения";
Письмо.HTMLBody = "Текст письма";
// Указываем адрес, от имени которого нужно отправить
// У пользователя в Outlook должны быть права на этот адрес
Письмо.SentOnBehalfOfName = "ccc@mail.ru";
Письмо.Send();
Важно помнить, что этот метод требует установленного и настроенного Outlook на компьютере, где выполняется код, и работает только в рамках корпоративного почтового сервера с соответствующими правами доступа.
Если вы используете современные облачные сервисы (например, "Почта для бизнеса"), разберем вариант с алиасами. Почтовый сервис позволяет одному физическому ящику иметь несколько имен. Например, основной ящик aaa@mail.ru может иметь псевдоним support@company.ru.
В этом случае при отправке через 1С с использованием стандартного объекта ИнтернетПочта, вы авторизуетесь под основным логином, но в поле отправителя указываете алиас. Рассмотрим, как это выглядит в коде:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "aaa@mail.ru"; // Реальный логин
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение = Новый ИнтернетПочтовоеСообщение;
// Здесь указываем алиас, разрешенный в настройках почтового сервиса
Сообщение.Отправитель.Адрес = "support@company.ru";
Сообщение.Отправитель.ОтображаемоеИмя = "Служба поддержки";
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Если полноценная подмена невозможна из-за жестких политик безопасности, а клиенту нужно просто визуально видеть другое имя, воспользуемся манипуляцией полем ОтображаемоеИмя. Это самый простой и безопасный способ, не вызывающий подозрений у спам-фильтров.
Посмотрим на пример формирования такого отправителя:
Сообщение = Новый ИнтернетПочтовоеСообщение;
// В отображаемое имя записываем желаемый адрес
Сообщение.Отправитель.ОтображаемоеИмя = "ccc@mail.ru";
// В реальный адрес - тот, под которым авторизуемся
Сообщение.Отправитель.Адрес = "aaa@mail.ru";
В интерфейсе многих почтовых программ (особенно мобильных) пользователь увидит "От: ccc@mail.ru". Только при раскрытии подробных свойств письма станет виден реальный адрес aaa@mail.ru. Это часто решает задачу "визуальной чистоты" без технических сложностей.
Выясним причину, по которой крупные компании поднимают свои почтовые сервера (Postfix, Exim). Свой сервер позволяет игнорировать проверку соответствия логина и поля From. Вы можете настроить сервер так, чтобы он принимал письма от 1С и пересылал их дальше, подставляя любой необходимый адрес в заголовки.
Однако помните: чтобы такие письма не попадали в спам, вам все равно придется настроить SPF и DKIM для домена, от имени которого вы шлете почту. В противном случае почтовые системы получателя заблокируют прием сообщений.
Подведем итог нашему анализу:
Выбирая метод, всегда учитывайте требования безопасности. Попытки "обмануть" почтовые сервера через незащищенные релеи могут привести к тому, что домен вашей компании попадет в глобальные черные списки (RBL), что парализует работу всей корпоративной почты.