Отправка электронных писем напрямую из 1С:Предприятие — одна из самых востребованных задач при автоматизации бизнес-процессов.hether вы хотите уведомлять клиентов о статусе заказа, рассылать счета или отправлять внутренние отчёты, встроенные механизмы платформы позволяют сделать это без ручного труда. Однако многие разработчики сталкиваются с проблемами: письма не доходят, попадают в спам или вообще не отправляются из-за неправильных настроек.
В этой статье мы разберём 5 проверенных способов отправки писем из 1С — от стандартного COM-объекта до интеграции с внешними сервисами типа Mailgun или SendPulse. Вы узнаете, как настроить SMTP-соединение, обойти ограничения почтовых сервисов, избежать блокировки писем и автоматизировать рассылки с вложениями. Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3 (включая 8.3.23).
Особое внимание уделим обходу ограничений бесплатных SMTP-серверов (например, Яндекс и Mail.ru блокируют массовые рассылки) и работе с HTML-письмами, которые корректно отображаются во всех почтовых клиентах. Если вы никогда не занимались отправкой писем из 1С — начните с раздела «Подготовка», если опыт есть — сразу переходите к нужному методу.
1. Подготовка: что нужно знать перед настройкой
Прежде чем писать код, проверьте 4 ключевых момента, которые влияют на успешность отправки:
- 🔌 Доступ к SMTP-серверу: Убедитесь, что ваш хостинг или локальная сеть не блокирует исходящие соединения на порт
25,465(SSL) или587(TLS). Многие провайдеры по умолчанию закрывают порт 25 для борьбы со спамом. - 📧 Авторизация на почтовом сервере: Бесплатные почтовые сервисы (Яндекс, Gmail, Mail.ru) требуют включения опции «Разрешить доступ по протоколу POP3/SMTP» в настройках аккаунта. Для Gmail также нужно сгенерировать App Password, если включена двухфакторная аутентификация.
- 🛡️ SPF, DKIM, DMARC: Если отправляете письма от доменного адреса (например,
info@ваша-компания.ru), настройте эти записи в DNS. Без них письма будут попадать в спам. - 📄 Правила почтового сервера: Некоторые серверы (например, Yandex Connect) ограничивают количество писем в час. Превышение лимита ведёт к временной блокировке.
Если вы отправляете письма от имени корпоративного домена, рекомендуем использовать специализированные сервисы вроде SendGrid или Mailgun. Они предоставляют API и SMTP с высокими лимитами, а также детальную статистику по доставке. Для тестирования подойдёт и бесплатный аккаунт на Gmail, но помните: Google может заблокировать аккаунт при подозрении в спаме (более 100 писем в день).
⚠️ Внимание: Настройки безопасности почтовых сервисов меняются часто. Например, с 2023 года Yandex требует обязательного использования TLS 1.2+ для SMTP-соединений. Перед настройкой проверьте актуальные требования в документации вашего почтового провайдера.
2. Способ 1: Отправка через COM-объект (простой метод)
Самый распространённый способ — использование встроенного COM-объекта для работы с почтой. Он поддерживается всеми версиями 1С:Предприятие 8.3 и не требует дополнительных компонент. Минус: работает только на Windows и зависит от настроек Outlook на компьютере.
Пример кода для отправки простого письма:
Процедура ОтправитьПисьмоЧерезCOM(Тема, Текст, Получатель, Вложения = "")
Попытка
// Создаём объект Outlook
Outlook = Новый COMОбъект("Outlook.Application");
Письмо = Outlook.CreateItem(0); // 0 - это olMailItem
// Заполняем поля письма
Письмо.Subject = Тема;
Письмо.Body = Текст;
Письмо.To = Получатель;
// Добавляем вложения, если есть
Если Не ПустаяСтрока(Вложения) Тогда
МассивВложений = СтроковыеФункцииКлиент.РазделитьСтроку(Вложения, ";");
Для Каждого Файл Из МассивВложений Цикл
Письмо.Attachments.Add(Файл);
КонецЦикла;
КонецЕсли;
// Отправляем сразу (без открытия Outlook)
Письмо.Send();
Возврат Истина;
Исключение
Сообщить("Ошибка отправки письма: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
Чтобы протестировать код, вызовите процедуру с параметрами:
ОтправитьПисьмоЧерезCOM(
"Тестовое письмо из 1С",
"Это тестовое сообщение, отправленное программно.",
"client@example.com",
"C:\Отчеты\отчет.xlsx;C:\Документы\договор.pdf"
);
Если при выполнении возникает ошибка "Не удалось создать COM-объект", проверьте:
- 🖥️ Установлен ли Microsoft Outlook на компьютере.
- 🔧 Запущена ли 1С с правами администратора (иногда требуется для доступа к COM).
- 🛠️ Включён ли в настройках Windows доступ к
COM-объектамдля 1С (черезdcomcnfg).
⚠️ Внимание: При отправке через COM письма сохраняются в папке «Отправленные» Outlook. Если у вас настроена архивация писем, это может привести к дублированию данных. Чтобы избежать этого, используйте метод Письмо.DeleteAfterSubmit = Истина (работает не во всех версиях Outlook).
Установлен Microsoft Outlook|1С запущена с правами администратора|Проверены настройки DCOM (dcomcnfg)|Отключены антивирусные блокировки для 1С-->
3. Способ 2: Прямое подключение к SMTP-серверу
Если вам нужно отправлять письма без привязки к Outlook (например, на сервере 1С или в Linux-окружении), используйте прямое подключение к SMTP-серверу через сокеты. Этот метод универсален, но требует знания протокола SMTP и обработки ошибок.
Ниже пример кода для отправки письма через Gmail SMTP (порт 587, TLS):
Процедура ОтправитьЧерезSMTP(Получатель, Тема, Текст, ЛогинSMTP, ПарольSMTP, СерверSMTP = "smtp.gmail.com", ПортSMTP = 587)
Попытка
// Создаём TCP-соединение
Соединение = Новый TCPСоединение(СерверSMTP, ПортSMTP, 30);
Поток = Соединение.ПолучитьПоток();
// Чтение и запись данных
Чтение = Новый ЧтениеТекста(Поток, КодировкаТекста.UTF8);
Запись = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);
// Приветствие сервера
Ответ = Чтение.ПрочитатьСтроку();
Если Не Лев(Ответ, 3) = "220" Тогда
Соединение.Закрыть();
Возврат Ложь;
КонецЕсли;
// Авторизация и отправка команды EHLO
Запись.ЗаписатьСтроку("EHLO smtp.gmail.com");
Ответ = Чтение.ПрочитатьСтроку();
// Шифрование (STARTTLS)
Запись.ЗаписатьСтроку("STARTTLS");
Ответ = Чтение.ПрочитатьСтроку();
Если Не Лев(Ответ, 3) = "220" Тогда
Соединение.Закрыть();
Возврат Ложь;
КонецЕсли;
// Здесь должен быть код для TLS-шифрования (требует дополнительных компонент)
// Для упрощения пропустим этот шаг (в реальном коде используйте OpenSSL или аналоги)
// Авторизация
Запись.ЗаписатьСтроку("AUTH LOGIN");
Ответ = Чтение.ПрочитатьСтроку();
Если Не Лев(Ответ, 3) = "334" Тогда
Соединение.Закрыть();
Возврат Ложь;
КонецЕсли;
// Кодируем логин и пароль в Base64
ЛогинBase64 = Base64Строка(ЛогинSMTP);
ПарольBase64 = Base64Строка(ПарольSMTP);
Запись.ЗаписатьСтроку(ЛогинBase64);
Ответ = Чтение.ПрочитатьСтроку();
Запись.ЗаписатьСтроку(ПарольBase64);
Ответ = Чтение.ПрочитатьСтроку();
// Формируем письмо
Запись.ЗаписатьСтроку("MAIL FROM: <" + ЛогинSMTP + ">");
Ответ = Чтение.ПрочитатьСтроку();
Запись.ЗаписатьСтроку("RCPT TO: <" + Получатель + ">");
Ответ = Чтение.ПрочитатьСтроку();
Запись.ЗаписатьСтроку("DATA");
Ответ = Чтение.ПрочитатьСтроку();
// Заголовки письма
ТекстПисьма = "From: <" + ЛогинSMTP + ">" + Символы.ПС;
ТекстПисьма = ТекстПисьма + "To: <" + Получатель + ">" + Символы.ПС;
ТекстПисьма = ТекстПисьма + "Subject: " + Тема + Символы.ПС;
ТекстПисьма = ТекстПисьма + "MIME-Version: 1.0" + Символы.ПС;
ТекстПисьма = ТекстПисьма + "Content-Type: text/plain; charset=UTF-8" + Символы.ПС + Символы.ПС;
ТекстПисьма = ТекстПисьма + Текст + Символы.ПС + "." + Символы.ПС;
Запись.ЗаписатьСтроку(ТекстПисьма);
Ответ = Чтение.ПрочитатьСтроку();
// Завершаем сессию
Запись.ЗаписатьСтроку("QUIT");
Соединение.Закрыть();
Возврат (Лев(Ответ, 3) = "250");
Исключение
Сообщить("Ошибка SMTP: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
Этот код упрощён и не включает обработку TLS/SSL (для этого нужны внешние компоненты вроде OpenSSL или CryptoPro). Для производственного использования лучше воспользоваться готовыми библиотеками, например, ПопыткаПодключенияКSMTP() из 1С:Библиотеки стандартных подсистем (БСП).
| Почтовый сервис | SMTP-сервер | Порт (TLS) | Порт (SSL) | Требует авторизации |
|---|---|---|---|---|
| Gmail | smtp.gmail.com |
587 | 465 | Да (включите "Less secure apps" или используйте App Password) |
| Yandex | smtp.yandex.ru |
587 | 465 | Да (включите SMTP в настройках почты) |
| Mail.ru | smtp.mail.ru |
587 | 465 | Да (разрешите доступ в настройках) |
| Outlook (Office 365) | smtp.office365.com |
587 | - | Да (требуется OAuth 2.0 для новых аккаунтов) |
Если вам нужно отправлять письма с вложениями, добавьте в заголовки письма раздел для multipart/mixed и закодируйте файлы в Base64. Пример кода для вложений можно найти в документации к RFC 2045.
Для отладки SMTP-соединений используйте сервис Mailtrap (бесплатный ящик для тестирования). Он показывает полные логи обмена данными с сервером, что помогает найти ошибки в командах.
4. Способ 3: Использование HTTP-сервисов (Mailgun, SendPulse, SendGrid)
Если SMTP кажется сложным или вы сталкиваетесь с блокировками, альтернатива — отправка писем через HTTP-API специализированных сервисов. Это надёжнее, так как:
- 📈 Высокий процент доставки (сервисы следят за репутацией IP).
- 📊 Детальная статистика по открытиям и кликам.
- 🔒 Встроенная обработка отписок (unsubscribe).
- 📧 Поддержка шаблонов и персонализации.
Рассмотрим интеграцию с Mailgun (бесплатно до 10 000 писем в месяц). Для начала:
- Зарегистрируйтесь на Mailgun и подтвердите домен.
- Получите
API Keyв панели управления. - Создайте HTTP-запрос из 1С.
Пример кода для отправки письма через Mailgun:
Процедура ОтправитьЧерезMailgun(Получатель, Тема, Текст, APIKey, Домен)
URL = "https://api.mailgun.net/v3/" + Домен + "/messages";
// Формируем тело запроса
ТелоЗапроса = Новый Структура();
ТелоЗапроса.Вставить("from", "1С Система ");
ТелоЗапроса.Вставить("to", Получатель);
ТелоЗапроса.Вставить("subject", Тема);
ТелоЗапроса.Вставить("text", Текст);
// Преобразуем в формат x-www-form-urlencoded
Запрос = "";
Для Каждого Ключ Из ТелоЗапроса Цикл
Если Запрос <> "" Тогда
Запрос = Запрос + "&";
КонецЕсли;
Запрос = Запрос + Ключ.Ключ + "=" + СтрЗначениеВВebЦвет(Ключ.Значение);
КонецЦикла;
// Настраиваем HTTP-соединение
HTTP = Новый HTTPСоединение(URL);
HTTP.УстановитьЗаголовок("Authorization", "Basic " + Base64Строка("api:" + APIKey));
HTTP.УстановитьЗаголовок("Content-Type", "application/x-www-form-urlencoded");
// Отправляем запрос
Попытка
Ответ = HTTP.ОтправитьДляОбработки(Запрос, "POST");
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Письмо отправлено! ID: " + Ответ.ПолучитьТекст());
Возврат Истина;
Иначе
Сообщить("Ошибка: " + Ответ.ПолучитьТекст());
Возврат Ложь;
КонецЕсли;
Исключение
Сообщить("Ошибка HTTP: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
Для отправки письма с HTML-контентом добавьте в структуру ТелоЗапроса ключ "html" вместо "text". Пример вызова:
ОтправитьЧерезMailgun(
"client@example.com",
"Ваш заказ №123 оформлен",
"Спасибо за покупку! Ваш заказ будет доставлен 15.05.2026.",
"key-123456789abcdef",
"mg.yourdomain.com"
);
Аналогичным образом работает интеграция с SendPulse и SendGrid. Главное отличие — формат API и лимиты. Например, SendGrid требует заголовок "Authorization: Bearer YOUR_API_KEY" вместо Basic.
⚠️ Внимание: При использовании внешних сервисов следите за лимитами. Например, бесплатный тариф Mailgun позволяет отправлять до 100 писем в час. Превышение лимита приводит к ошибке 400 Quota exceeded. Для массовых рассылок выбирайте платные тарифы или настраивайте задержки между отправками.
Как проверить, дошло ли письмо?
Многие сервисы (Mailgun, SendGrid) предоставляют вебхуки (webhooks) для отслеживания статуса писем. Настройте URL в личном кабинете, куда сервис будет отправлять уведомления о доставке, открытии или кликах. В 1С можно создать HTTP-сервис для обработки этих уведомлений.
5. Способ 4: Отправка через Exchange Web Services (EWS)
Если ваша компания использует Microsoft Exchange Server или Office 365, можно отправлять письма через Exchange Web Services (EWS). Этот метод надёжнее SMTP, так как использует корпоративную инфраструктуру и поддерживает расширенные функции (встречи, задачи, контакты).
Для работы с EWS потребуется:
- Установить 1С:Библиотеку интеграции с Microsoft Exchange (доступна в каталоге решений 1С).
- Получить данные для подключения:
- Адрес EWS (обычно
https://outlook.office365.com/EWS/Exchange.asmxдля Office 365). - Логин и пароль пользователя (или OAuth-токен для современных версий).
- Адрес EWS (обычно
- 🔐 Поддержка OAuth 2.0 (безопаснее, чем логин/пароль).
- 📅 Возможность работать с календарём, задачами и контактами.
- 📊 Логирование всех действий в журнале Exchange.
- ⚙️ Сложнее в настройке (требуется доступ к Exchange).
- 💰 Для Office 365 нужна лицензия на пользователя.
Пример кода для отправки письма через EWS:
Процедура ОтправитьЧерезEWS(Получатель, Тема, Текст, Логин, Пароль, СерверEWS = "https://outlook.office365.com/EWS/Exchange.asmx")
Попытка
// Подключаем библиотеку EWS (должна быть установлена)
EWS = Новый ExchangeWebServices(СерверEWS, Логин, Пароль);
// Создаём письмо
Письмо = EWS.SоздатьПисьмо();
Письмо.Тема = Тема;
Письмо.Текст = Текст;
Письмо.ДобавитьПолучателя(Получатель, ТипПолучателяEWS.Кому);
// Отправляем
Результат = EWS.ОтправитьПисьмо(Письмо);
Если Результат.Успех Тогда
Сообщить("Письмо отправлено! ID: " + Результат.ИдПисьма);
Возврат Истина;
Иначе
Сообщить("Ошибка: " + Результат.ОписаниеОшибки);
Возврат Ложь;
КонецЕсли;
Исключение
Сообщить("Ошибка EWS: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
Преимущества EWS:
Недостатки:
EWS — лучший выбор для корпоративных решений на базе Microsoft Exchange. Для небольших компаний или облачных сервисов проще использовать SMTP или HTTP-API.
6. Способ 5: Отправка через внешнюю обработку (универсальный вариант)
Если вам нужно гибкое решение, которое работает и на Windows, и на Linux, и не зависит от почтовых протоколов, используйте внешнюю обработку. Суть метода:
- Создайте обработку (или конфигурацию) с формой ввода параметров письма.
- Реализуйте в ней логику отправки (через SMTP, COM или API).
- Подключите обработку к основной базе и вызывайте её программно.
Пример структуры внешней обработки:
// В модуле объекта обработки
Процедура ОтправитьПисьмоНаСервере(Параметры) Экспорт
Попытка
// Здесь реализуем любой из описанных выше методов
// Например, через SMTP:
Возврат ОтправитьЧерезSMTP(
Параметры.Получатель,
Параметры.Тема,
Параметры.Текст,
Параметры.ЛогинSMTP,
Параметры.ПарольSMTP
);
Исключение
ЗаписатьЛог(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецПроцедуры
Чтобы вызвать обработку из основной базы:
// В модуле вашей конфигурации
Процедура ВызватьВнешнююОбработку()
ПутьКФайлу = "C:\Обработки\ОтправкаПисем.epf";
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу);
Параметры = Новый Структура();
Параметры.Вставить("Получатель", "client@example.com");
Параметры.Вставить("Тема", "Тестовое письмо");
Параметры.Вставить("Текст", "Привет из 1С!");
Параметры.Вставить("ЛогинSMTP", "your@email.com");
Параметры.Вставить("ПарольSMTP", "password");
Результат = Обработка.ОтправитьПисьмоНаСервере(Параметры);
Если Результат Тогда
Сообщить("Письмо отправлено!");
Иначе
Сообщить("Ошибка отправки!");
КонецЕсли;
КонецПроцедуры
Преимущества внешней обработки:
- 🔄 Легко обновлять логику отправки без изменения основной конфигурации.
- 🛠️ Можно тестировать отдельно от рабочей базы.
- 📂 Поддерживаются все методы отправки (SMTP, COM, API) в одном месте.
⚠️ Внимание: При использовании внешних обработок следите за версионностью. Если обработка написана для платформы 8.3.20, она может не работать в 8.3.15 из-за изменений в API. Всегда указывайте минимальную версию платформы в документации к обработке.
7. Типичные ошибки и как их исправить
Даже опытные разработчики сталкиваются с проблемами при отправке писем из 1С. Рассмотрим TOP-5 ошибок и способы их решения:
| Ошибка | Причина | Решение |
|---|---|---|
Не удалось создать COM-объект "Outlook.Application" |
Outlook не установлен или заблокирован антивирусом. | Установите Outlook, запустите 1С от имени администратора, проверьте настройки DCOM (dcomcnfg). |
535 Authentication failed (SMTP) |
Неправильный логин/пароль или не включена авторизация на сервере. | Проверьте настройки почтового ящика (разрешите доступ по SMTP), сгенерируйте App Password для Gmail. |
421 Service not available |
Превышен лимит писем или IP заблокирован. | Используйте другой SMTP-сервер или добавьте задержку между отправками (например, Подождать(60)). |
| Письма попадают в спам | Отсутствуют SPF/DKIM записи или подозрительный контент. | Настройте DNS-записи для домена, избегайте спам-слов ("бесплатно", "акция"), используйте HTML-шаблоны. |
Ошибка HTTP 403 (при использовании API) |
Неверный API-ключ или превышен лимит запросов. | Проверьте ключ, изучите лимиты тарифа, добавьте обработку ошибок в код. |
Если письма не доходят без видимых ошибок, проверьте:
- 📤 Логи почтового сервера (в панели управления хостингом или через
telnet). - 🔍 Папку "Спам" у получателя.
- 📡 Настройки фаервола/антивируса (они могут блокировать исходящие соединения).
Для диагностики SMTP-соединений вручную используйте команды telnet:
telnet smtp.yandex.ru 587
EHLO test
AUTH LOGIN
[введите логин в Base64]
[введите пароль в Base64]
Если на каком-то этапе сервер возвращает ошибку (например, 530 Authentication required), вы точно знаете, где искать проблему.
8. Оптимизация и автоматизация рассылок
Отправка единичных писем — это просто, но что делать, если нужно рассылать сотни сообщений клиентам? Вот 5 советов для оптимизации:
- 📊 Используйте фоновые задания: Отправляйте письма в
ФоновоеЗадание, чтобы не блокировать интерфейс 1С. - ⏱️ Добавляйте задержки: Между отправками писем делайте паузу (например, 1-2 секунды), чтобы не попасть под блокировку.
- 📑 Шаблонизируйте письма: Храните HTML-шаблоны в справочнике и подставляйте динамические данные (имя клиента, сумма заказа).
- 📈 Логируйте отправки: Ведите журнал