Отправка e-mail из 1С: настройка почты и код на встроенном языке
Содержание
Отправить письмо из
1С можно двумя путями: вручную через подсистему «Почта» в типовой конфигурации (Администрирование → Органайзер) или программно из встроенного языка объектами ИнтернетПочтовыйПрофиль и ИнтернетПочта. В обоих случаях нужны одни и те же параметры SMTP-сервера: адрес, порт, логин и пароль.
Главная причина, по которой письмо не уходит, — не код, а настройки доступа у почтового провайдера. Яндекс, Mail.ru и Gmail давно не принимают обычный пароль от ящика: нужен отдельный пароль приложения. Ниже — параметры серверов, пути в типовых конфигурациях, рабочий пример кода с вложениями и разбор ошибок отправки.
С чего начать: адрес SMTP, порт и пароль приложения
Для отправки нужен исходящий сервер SMTP. Три параметра определяют всё остальное — адрес сервера, порт и способ шифрования. Вот ориентиры по популярным провайдерам:
| Провайдер | Адрес SMTP | Порт | Шифрование |
|---|---|---|---|
| Яндекс.Почта | smtp.yandex.ru | 465 | SSL |
| Mail.ru | smtp.mail.ru | 465 | SSL |
| Gmail | smtp.gmail.com | 465 | SSL |
| Корпоративный сервер | уточните у администратора | 587 или 25 | STARTTLS или без |
Порт 465 — это шифрование SSL с самого начала соединения, самый предсказуемый вариант. Порт 587 — шифрование STARTTLS, его чаще используют корпоративные серверы. Порт 25 обычно закрыт у провайдеров и хостингов, на него закладываться не стоит.
Яндекс, Mail.ru и Gmail не пускают по обычному паролю от почты. В настройках безопасности ящика включите двухфакторную аутентификацию и создайте пароль приложения — отдельную длинную строку. Именно её 1С подставляет вместо пароля. Это причина большинства ошибок «неверный логин или пароль».
Пароль приложения создаётся в разделе безопасности почтового ящика — обычно это пункт «Пароли приложений» или «Пароли для внешних приложений». Строку показывают один раз, поэтому скопируйте её сразу. У Яндекса дополнительно нужно разрешить доступ по протоколу SMTP в настройках почтовых программ — без этого сервер отклонит соединение даже с верным паролем.
Что проверить перед первой отправкой:
Как включить почту в типовых конфигурациях
В типовых конфигурациях на БСП отправка настраивается без кода — через учётную запись электронной почты. Путь к настройке зависит от конфигурации:
| Конфигурация | Путь к настройкам почты |
|---|---|
| Бухгалтерия предприятия 3.0 | Администрирование → Органайзер |
| Зарплата и управление персоналом 3.1 | Администрирование → Органайзер |
| Управление торговлей 11 | НСИ и администрирование → Органайзер |
В разделе «Органайзер» включите флажок почтового клиента, после чего станет доступна ссылка на список учётных записей электронной почты. Там заводится ящик: при вводе адреса вроде buh@yandex.ru помощник сам подставляет известные параметры сервера, остаётся ввести логин и пароль приложения.
Отдельно стоит системная учётная запись. Её программа использует для своих рассылок — отправки счетов и актов сверки контрагентам, писем с отчётами, уведомлений. Если документы «не отправляются по кнопке с конвертом», первым делом проверяют именно системную учётную запись: задан ли адрес отправителя и верен ли пароль.
В карточке учётной записи параметры разнесены на входящую и исходящую почту. Для отправки важна только исходящая часть — сервер SMTP. Входящий сервер (POP или IMAP) нужен, если вы хотите ещё и получать письма внутри 1С; для чистой отправки его можно не заполнять.
После ввода параметров нажмите проверку соединения прямо в карточке учётной записи. Программа попытается соединиться с сервером и сразу покажет ошибку, если порт закрыт или пароль не подходит. Это быстрее, чем ловить сбой на реальной отправке документа.
Как отправить печатную форму документа по почте
Самая частая задача — отправить контрагенту счёт, акт или накладную не файлом вручную, а прямо из документа. Для этого системная учётная запись уже должна быть настроена.
Порядок действий:
- Откройте нужный документ — счёт на оплату, реализацию, акт.
- Сформируйте печатную форму через команду печати в панели документа.
- В открывшейся печатной форме выберите команду отправки по электронной почте (значок конверта или пункт в меню печати).
- 1С соберёт печатную форму во вложение — обычно в PDF — и откроет форму исходящего письма.
- Адрес получателя подставится сам, если у контрагента в контактной информации заполнен e-mail. Если поле пустое, введите адрес вручную.
- Проверьте тему и текст, при необходимости добавьте вложения и нажмите отправку.
Чтобы адрес каждый раз подставлялся автоматически, один раз заполните 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 стоит только если конкретный получатель с устаревшим сервером иначе читать не может.
Обработка ошибок и запись в журнал регистрации
Отправка зависит от сети и чужого сервера, поэтому любой вызов Подключиться и Послать оборачивают в попытку. Без этого при первом же сбое связи обработка завершится с ошибкой, а пользователь увидит непонятный технический текст.
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации(
"Отправка почты",
УровеньЖурналаРегистрации.Ошибка,
, ,
ТекстОшибки);
Сообщить("Письмо не отправлено. Подробности — в журнале регистрации.");
КонецПопытки;
Что здесь происходит:
ОписаниеОшибки()возвращает текст сбоя — именно он подскажет причину (отказ авторизации, таймаут, ошибка SSL).ЗаписьЖурналаРегистрациисохраняет этот текст в журнал. Потом его видно вАдминистрирование → Журнал регистрациис отбором по событию «Отправка почты».- Пользователю показываем короткое человеческое сообщение, а технические детали оставляем в журнале.
При массовой рассылке не прерывайте весь цикл из-за одного плохого адреса. Оборачивайте в Попытка отправку каждого письма отдельно и копите список неудачных адресов — отправите их повторно, разобравшись с причиной.
Журнал регистрации полезен и для разбора разовых сбоев. Если пользователь жалуется, что «письмо не ушло», откройте журнал за нужный период с отбором по событию отправки — там будет тот самый технический текст сервера, по которому видно настоящую причину. Это надёжнее, чем опрашивать пользователя, какое именно сообщение он увидел.
Почему письмо не уходит: разбор частых ошибок
Текст из ОписаниеОшибки() или из журнала регистрации почти всегда указывает на конкретную причину. Сопоставьте симптом с решением:
ПарольSMTP.ИспользоватьSSLSMTP = Истина. Для порта 587 обычно используется STARTTLS — уточните настройку у провайдера.Если симптом непонятен, локализуйте проблему по шагам:
- Отправьте тестовое письмо с того же сервера самому себе на простой публичный ящик (например, на Яндекс). Дойдёт — проблема в адресе или фильтрах получателя, а не в настройках.
- Проверьте соединение кнопкой прямо в карточке учётной записи — так видно, доступен ли сервер и подходит ли пароль, без формирования письма.
- При серверном коде повторите проверку на машине сервера 1С: порт, открытый на компьютере пользователя, ничего не решает, если отправляет сервер.
Отдельно про таймаут: значение ТаймаутСоединения в секундах стоит задать в пределах 30–60. Слишком маленькое значение обрывает нормальную отправку на медленном канале, слишком большое — заставляет пользователя долго ждать при недоступном сервере.
Частые вопросы
Можно ли отправить письмо без настройки учётной записи, прямо из кода?
ИнтернетПочтовыйПрофиль параметры SMTP задаются напрямую в коде, учётная запись в конфигурации для этого не нужна. Но хранить пароль в коде небезопасно — для регулярных рассылок лучше завести учётную запись.Чем отличается системная учётная запись от обычной?
Нужен ли интернет на компьютере пользователя, если 1С работает в клиент-серверном режиме?
Как отправить одно письмо сразу нескольким получателям?
Письмо.Получатели.Добавить() для каждого адреса. Для скрытых копий используйте коллекцию СлепыеКопии, для обычных копий — Копии.Почему письмо с кириллицей приходит нечитаемым?
Письмо.Кодировка = "UTF-8" явно — её понимают все современные почтовые системы.