Отправка e-mail из 1С: настройка почты и код на встроенном языке

· 10 мин

Содержание

Отправить письмо из 1С можно двумя путями: вручную через подсистему «Почта» в типовой конфигурации (Администрирование → Органайзер) или программно из встроенного языка объектами ИнтернетПочтовыйПрофиль и ИнтернетПочта. В обоих случаях нужны одни и те же параметры SMTP-сервера: адрес, порт, логин и пароль.

Главная причина, по которой письмо не уходит, — не код, а настройки доступа у почтового провайдера. Яндекс, Mail.ru и Gmail давно не принимают обычный пароль от ящика: нужен отдельный пароль приложения. Ниже — параметры серверов, пути в типовых конфигурациях, рабочий пример кода с вложениями и разбор ошибок отправки.

С чего начать: адрес SMTP, порт и пароль приложения

Для отправки нужен исходящий сервер SMTP. Три параметра определяют всё остальное — адрес сервера, порт и способ шифрования. Вот ориентиры по популярным провайдерам:

ПровайдерАдрес SMTPПортШифрование
Яндекс.Почтаsmtp.yandex.ru465SSL
Mail.rusmtp.mail.ru465SSL
Gmailsmtp.gmail.com465SSL
Корпоративный серверуточните у администратора587 или 25STARTTLS или без

Порт 465 — это шифрование SSL с самого начала соединения, самый предсказуемый вариант. Порт 587 — шифрование STARTTLS, его чаще используют корпоративные серверы. Порт 25 обычно закрыт у провайдеров и хостингов, на него закладываться не стоит.

Яндекс, Mail.ru и Gmail не пускают по обычному паролю от почты. В настройках безопасности ящика включите двухфакторную аутентификацию и создайте пароль приложения — отдельную длинную строку. Именно её 1С подставляет вместо пароля. Это причина большинства ошибок «неверный логин или пароль».

Пароль приложения создаётся в разделе безопасности почтового ящика — обычно это пункт «Пароли приложений» или «Пароли для внешних приложений». Строку показывают один раз, поэтому скопируйте её сразу. У Яндекса дополнительно нужно разрешить доступ по протоколу SMTP в настройках почтовых программ — без этого сервер отклонит соединение даже с верным паролем.

Что проверить перед первой отправкой:

Готовность к отправке почты
Выполнено: 0 / 5

Как включить почту в типовых конфигурациях

В типовых конфигурациях на БСП отправка настраивается без кода — через учётную запись электронной почты. Путь к настройке зависит от конфигурации:

КонфигурацияПуть к настройкам почты
Бухгалтерия предприятия 3.0Администрирование → Органайзер
Зарплата и управление персоналом 3.1Администрирование → Органайзер
Управление торговлей 11НСИ и администрирование → Органайзер

В разделе «Органайзер» включите флажок почтового клиента, после чего станет доступна ссылка на список учётных записей электронной почты. Там заводится ящик: при вводе адреса вроде buh@yandex.ru помощник сам подставляет известные параметры сервера, остаётся ввести логин и пароль приложения.

Отдельно стоит системная учётная запись. Её программа использует для своих рассылок — отправки счетов и актов сверки контрагентам, писем с отчётами, уведомлений. Если документы «не отправляются по кнопке с конвертом», первым делом проверяют именно системную учётную запись: задан ли адрес отправителя и верен ли пароль.

В карточке учётной записи параметры разнесены на входящую и исходящую почту. Для отправки важна только исходящая часть — сервер SMTP. Входящий сервер (POP или IMAP) нужен, если вы хотите ещё и получать письма внутри 1С; для чистой отправки его можно не заполнять.

После ввода параметров нажмите проверку соединения прямо в карточке учётной записи. Программа попытается соединиться с сервером и сразу покажет ошибку, если порт закрыт или пароль не подходит. Это быстрее, чем ловить сбой на реальной отправке документа.

Как отправить печатную форму документа по почте

Самая частая задача — отправить контрагенту счёт, акт или накладную не файлом вручную, а прямо из документа. Для этого системная учётная запись уже должна быть настроена.

Порядок действий:

  1. Откройте нужный документ — счёт на оплату, реализацию, акт.
  2. Сформируйте печатную форму через команду печати в панели документа.
  3. В открывшейся печатной форме выберите команду отправки по электронной почте (значок конверта или пункт в меню печати).
  4. 1С соберёт печатную форму во вложение — обычно в PDF — и откроет форму исходящего письма.
  5. Адрес получателя подставится сам, если у контрагента в контактной информации заполнен e-mail. Если поле пустое, введите адрес вручную.
  6. Проверьте тему и текст, при необходимости добавьте вложения и нажмите отправку.

Чтобы адрес каждый раз подставлялся автоматически, один раз заполните e-mail в карточке контрагента в блоке контактной информации. Тогда при отправке документов вводить его вручную не придётся.

Отправка письма из встроенного языка 1С

Когда нужна своя логика — рассылка по списку, письмо из обработки, уведомление по событию — письмо собирают кодом. Отправка строится из трёх объектов: профиль с настройками сервера, само сообщение и объект соединения.

Профиль хранит параметры SMTP:

Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP         = 465;
Профиль.ПользовательSMTP = "buh@yandex.ru";
Профиль.ПарольSMTP       = "пароль_приложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТаймаутСоединения   = 30;

Дальше собирается само сообщение. Указываем тему, отправителя, добавляем получателя и текст:

Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема       = "Акт сверки за квартал";
Письмо.Отправитель = "buh@yandex.ru";

Получатель = Письмо.Получатели.Добавить();
Получатель.Адрес = "client@example.com";
Получатель.Представление = "Бухгалтерия ООО Ромашка";

Текст = Письмо.Тексты.Добавить(
    "Здравствуйте! Во вложении акт сверки.",
    ТипТекстаПочтовогоСообщения.ПростойТекст);

Свойство Представление у получателя задаёт отображаемое имя — тогда в почте адресат увидит не голый адрес, а понятную подпись. Если писем нужно разослать несколько, собирайте получателей в цикле по списку адресов, вызывая Получатели.Добавить() для каждого.

Остаётся подключиться и отправить. Соединение обязательно закрываем:

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();

Такой код размещают там, где он должен срабатывать: в обработке для разовой рассылки, в общем модуле для повторного использования, в процедуре по событию документа. Профиль с настройками сервера достаточно собрать один раз и переиспользовать для всех писем в рамках одной операции — пересоздавать его под каждое сообщение не нужно.

Несколько важных деталей:

  • 📬 Адрес в Отправитель должен совпадать с логином учётной записи. Провайдер не даст отправить «от чужого имени» — письмо либо не уйдёт, либо попадёт в спам.
  • 👥 Получателей можно добавить несколько: вызовите Письмо.Получатели.Добавить() в цикле по списку адресов.
  • 🖥 Если код выполняется на сервере 1С, соединение с почтовым сервером устанавливает именно сервер. Открывать порт и проверять доступ надо на машине сервера, а не на компьютере пользователя.

Вложения, HTML-тело и кодировка письма

Вложение добавляется в коллекцию Вложения. Файл читается в двоичные данные и передаётся вместе с именем:

ДанныеФайла = Новый ДвоичныеДанные("C:\Обмен\akt.pdf");
Письмо.Вложения.Добавить(ДанныеФайла, "akt.pdf");

При отправке с сервера путь к файлу — это путь на сервере, а не на клиентском компьютере. Чаще вложение берут не с диска, а из реквизита или макета: двоичные данные уже лежат в памяти, и их напрямую передают в Добавить.

Вложений в одном письме может быть несколько — просто вызовите Добавить для каждого файла. Но следите за общим размером: почтовые провайдеры ограничивают письмо примерно 20–25 МБ. Тяжёлые файлы лучше класть в облако и присылать ссылку, иначе сервер вернёт отказ, а письмо не уйдёт.

Если нужно письмо с оформлением — таблицей, ссылками, жирным шрифтом — добавляйте текст в формате HTML:

ТекстHTML = "<html><body>" 
    + "<p>Здравствуйте!</p>" 
    + "<p>Во вложении <b>акт сверки</b>.</p>" 
    + "</body></html>";
Письмо.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);

Не добавляйте в одно письмо два текста с одинаковым смыслом — простой и HTML одновременно без необходимости. Выберите один тип: простой текст для коротких уведомлений, HTML — где нужно оформление.

Если в оформленное письмо нужно встроить картинку — логотип или подпись прямо в теле, — используйте тип РасширенныйHTML и добавьте изображение во вложения с идентификатором, на который ссылается тег img в разметке. Для обычных писем без встроенной графики это не нужно, достаточно типа HTML.

Кириллица в теме и теле иногда приходит «кракозябрами», если у получателя старый почтовый клиент. Чтобы подстраховаться, задайте кодировку явно:

Письмо.Кодировка = "UTF-8";

UTF-8 понимают все современные почтовые системы. Менять её на windows-1251 стоит только если конкретный получатель с устаревшим сервером иначе читать не может.

Обработка ошибок и запись в журнал регистрации

Отправка зависит от сети и чужого сервера, поэтому любой вызов Подключиться и Послать оборачивают в попытку. Без этого при первом же сбое связи обработка завершится с ошибкой, а пользователь увидит непонятный технический текст.

Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль);
    Почта.Послать(Письмо);
    Почта.Отключиться();
Исключение
    ТекстОшибки = ОписаниеОшибки();
    ЗаписьЖурналаРегистрации(
        "Отправка почты",
        УровеньЖурналаРегистрации.Ошибка,
        , ,
        ТекстОшибки);
    Сообщить("Письмо не отправлено. Подробности — в журнале регистрации.");
КонецПопытки;

Что здесь происходит:

  1. ОписаниеОшибки() возвращает текст сбоя — именно он подскажет причину (отказ авторизации, таймаут, ошибка SSL).
  2. ЗаписьЖурналаРегистрации сохраняет этот текст в журнал. Потом его видно в Администрирование → Журнал регистрации с отбором по событию «Отправка почты».
  3. Пользователю показываем короткое человеческое сообщение, а технические детали оставляем в журнале.

При массовой рассылке не прерывайте весь цикл из-за одного плохого адреса. Оборачивайте в Попытка отправку каждого письма отдельно и копите список неудачных адресов — отправите их повторно, разобравшись с причиной.

Журнал регистрации полезен и для разбора разовых сбоев. Если пользователь жалуется, что «письмо не ушло», откройте журнал за нужный период с отбором по событию отправки — там будет тот самый технический текст сервера, по которому видно настоящую причину. Это надёжнее, чем опрашивать пользователя, какое именно сообщение он увидел.

Почему письмо не уходит: разбор частых ошибок

Текст из ОписаниеОшибки() или из журнала регистрации почти всегда указывает на конкретную причину. Сопоставьте симптом с решением:

Диагностика: выберите симптом

Если симптом непонятен, локализуйте проблему по шагам:

  1. Отправьте тестовое письмо с того же сервера самому себе на простой публичный ящик (например, на Яндекс). Дойдёт — проблема в адресе или фильтрах получателя, а не в настройках.
  2. Проверьте соединение кнопкой прямо в карточке учётной записи — так видно, доступен ли сервер и подходит ли пароль, без формирования письма.
  3. При серверном коде повторите проверку на машине сервера 1С: порт, открытый на компьютере пользователя, ничего не решает, если отправляет сервер.

Отдельно про таймаут: значение ТаймаутСоединения в секундах стоит задать в пределах 30–60. Слишком маленькое значение обрывает нормальную отправку на медленном канале, слишком большое — заставляет пользователя долго ждать при недоступном сервере.

Частые вопросы

Можно ли отправить письмо без настройки учётной записи, прямо из кода?
Да. Объекту ИнтернетПочтовыйПрофиль параметры SMTP задаются напрямую в коде, учётная запись в конфигурации для этого не нужна. Но хранить пароль в коде небезопасно — для регулярных рассылок лучше завести учётную запись.
Чем отличается системная учётная запись от обычной?
Системную учётную запись программа использует для своих рассылок — отправки документов контрагентам, писем с отчётами, уведомлений. Обычные учётные записи привязаны к конкретным пользователям для их личной переписки.
Нужен ли интернет на компьютере пользователя, если 1С работает в клиент-серверном режиме?
Нет. При серверном коде соединение с почтовым сервером устанавливает сервер 1С. Доступ к порту SMTP должен быть открыт на машине сервера, а не на компьютере пользователя.
Как отправить одно письмо сразу нескольким получателям?
Вызовите Письмо.Получатели.Добавить() для каждого адреса. Для скрытых копий используйте коллекцию СлепыеКопии, для обычных копий — Копии.
Почему письмо с кириллицей приходит нечитаемым?
Старый почтовый клиент получателя не распознаёт кодировку. Задайте Письмо.Кодировка = "UTF-8" явно — её понимают все современные почтовые системы.