При автоматизации бизнес-процессов в 1С часто возникает задача программной отправки электронных писем. Если в организации в качестве основного почтового клиента используется Microsoft Outlook, разработчики сталкиваются с выбором: использовать встроенные механизмы 1С, протоколы SMTP или прямое управление приложением через COM-объект. Рассмотрим подробнее каждый из этих способов, разберем их преимущества, недостатки и способы обхода типовых ошибок.
Первый и самый простой способ — использование объекта Почта. Этот объект работает через программный интерфейс MAPI (Messaging Application Programming Interface), который позволяет 1С взаимодействовать с почтовым клиентом, установленным в системе по умолчанию.
Проанализируем базовый пример кода для этого метода:
&НаКлиенте
Процедура ОтправитьЧерезMAPI(Команда)
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Текст = "Текст сообщения";
Сообщение.Отправитель = "petya@pupkin.com";
Сообщение.Тема = "Тема сообщения";
Сообщение.Получатели.Добавить("vasya@pupkin.com");
Почта = Новый Почта;
// Подключаемся к профилю Outlook, заданному в системе
Попытка
Почта.Подключиться("Default Outlook Profile");
// Параметр Истина означает отображение окна Outlook перед отправкой
Почта.Послать(Сообщение, Истина);
Почта.Отключиться();
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важные нюансы этого метода:
ПочтовоеСообщение может иметь ограничения в зависимости от версии платформы.Если нам требуется полный контроль над процессом отправки, выбор учетной записи или работа в фоновом режиме без лишних вопросов от системы безопасности, рассмотрим использование технологии COM. Этот метод позволяет обращаться к объектной модели Outlook напрямую.
Разберем детально рабочий пример кода для платформы 8.2 и 8.3:
Процедура ОтправитьПисьмоЧерезCOM()
Попытка
Оутлук = Новый COMОбъект("Outlook.Application");
Исключение
Сообщить("Программа MS Outlook не установлена или недоступна: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создаем новый объект письма (0 - olMailItem)
Письмо = Оутлук.CreateItem(0);
// Выбор конкретной учетной записи (если их несколько)
Для Каждого Аккаунт Из Оутлук.Session.Accounts Цикл
Если Аккаунт.UserName = "НужныйАккаунт" Тогда
Письмо.SendUsingAccount = Аккаунт;
Прервать;
КонецЕсли;
КонецЦикла;
Попытка
// Настройка параметров письма
Письмо.Subject = "Тема сообщения из 1С";
Письмо.HTMLBody = "<html><body><p>Добрый день!</p><p>Это тестовое письмо.</p></body></html>";
// Добавление получателя
Получатель = Письмо.Recipients.Add("vasya@pupkin.com");
Получатель.Type = 1; // 1 - Кому (olTo)
// Добавление вложения
ПутьКФайлу = "C:\Reports\Отчет.pdf";
Письмо.Attachments.Add(ПутьКФайлу);
// Отправка или показ окна
// Письмо.Display(); // Раскомментируйте, если нужно показать письмо пользователю
Письмо.Send();
Сообщить("Письмо успешно передано в Outlook!");
Исключение
Сообщить("Ошибка при формировании письма: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В этом примере мы используем объект Outlook.Application. Основное преимущество здесь — возможность работы с HTMLBody, что позволяет создавать красивые письма с таблицами и оформлением. Кроме того, через коллекцию Recipients можно гибко управлять списком получателей, включая копии (Type = 2) и скрытые копии (Type = 3). Для практической реализации такой отправки с подписью и вложениями пригодится пример создания писем в Outlook с подписью и вложением.
Если ваша цель — отправить письмо "тихо" и быстро, не привязываясь к установленному почтовому клиенту на компьютере пользователя, следует использовать объект ИнтернетПочта. Это наиболее профессиональный подход для серверных задач. Для реализации отправки сообщений средствами 1С без доработки конфигурации можно использовать расширение для отправки и получения почтовых сообщений.
Рассмотрим пример реализации:
Процедура ОтправитьПисьмоSMTP()
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "user@mail.ru";
Профиль.ПарольSMTP = "your_password";
Профиль.ТолькоЛокальныйПросмотрПочты = Ложь;
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.ИмяОтправителя = "Робот 1С";
Сообщение.Отправитель = "user@mail.ru";
Сообщение.Тема = "Автоматический отчет";
Текст = Сообщение.Тексты.Добавить("Текст сообщения");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Сообщение.Получатели.Добавить("client@gmail.com");
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Сообщить("Письмо отправлено напрямую через сервер!");
Исключение
Сообщить("Ошибка соединения с сервером: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Преимущества ИнтернетПочты:
Проанализируем ситуацию, когда письмо "застревает" в исходящих. Это часто происходит при использовании COM или MAPI. Outlook — интерактивное приложение, и для фактической отправки ему нужно инициировать сеанс связи с сервером. Если вы используете Письмо.Send(), письмо просто помещается в очередь.
Рекомендация: Чтобы форсировать отправку, можно использовать команду синхронизации или просто оставлять Outlook запущенным. Также проверьте настройки в самом Outlook: "Параметры" -> "Дополнительно" -> "Отправка и получение" -> "Выполнять немедленную отправку при наличии подключения".
Еще один критический момент — разрядность приложений. Если у вас установлена 64-битная версия MS Office, а 1С работает в 32-битном режиме, создание COM-объекта может завершиться ошибкой "Класс не зарегистрирован". В таком случае рекомендуется либо привести приложения к одной разрядности, либо использовать запуск через dllhost (настройка в консоли DCOM), либо полностью перейти на использование ИнтернетПочта.
Подведем итог: если вам нужно, чтобы пользователь видел процесс и мог отредактировать письмо перед отправкой, выбирайте COM-объект и метод Display(). Если требуется полностью автоматическая отправка от имени системы — используйте ИнтернетПочта.