У разработчиков на платформе 1С иногда возникает задача по взаимодействию системы 1С: Предприятие с различными почтовыми программами и протоколами. 1С Предприятие 8 имеет довольно удобные средства для отправки сообщений, импорта писем из почтового клиента в справочник или другой объект конфигурации, работы с MAPI, SMTP или POP3.
При работе с почтой разделяют два способа доступа к почтовому ящику, почтовому клиенту:
объект "Почта" и объект "Интернет почта", каждый из объектов имеет свои достоинства.
Почта - предоставляет доступ к почте через встроенный почтовый клиент, работает по технологии MAPI.
Интернет почта - объект открывает возможности по доступу непосредственно к почтовым ящикам и учетным записям находящимися на почтовом сервере, использование и работа данного объекта не зависит от установленных в системе почтовых клиентов, даже если почтовый клиент установлен в системе "ИнтернетПочта" будет работать параллельно с ним, объект использует интернет-протоколы SMTP, POP3.
1.Получение сообщений объектом "Почта".
Для работы с объектом Почта необходимо наличие установленного на компьютере почтового клиента с описанными учетными записями.
Для подключения к почтовому клиенту у объекта есть метод "Подключиться".
Почта = Новый Почта;
Почта.Подключиться(,);
Почта.Подключиться("Outlook");
//Выбираем все письма, со всеми вложениями.
Сообщения = Почта.Выбрать(Ложь,Ложь);
Для каждого Сообщение Из Сообщения Цикл
//Добавляем строку в табличную часть
СтрокаТП = ТабличноеПоле1.Добавить();
// Перебираем коллекцию получателей сообщения
Для каждого Получатель Из Письмо.Получатели Цикл
Получатели = Получатели + Получатель.Пользователь + " <" + Получатель.Адрес + "> ";
КонецЦикла;
СтрокаТП.Кому = Получатели;
Попытка
СтрокаТП.ОтКого= Сообщение.Отправитель.Адрес;
Исключение
СтрокаТП.ОтКого= Сообщение.Отправитель;
КонецПопытки;
СтрокаТП.Тема = Сообщение.Тема;
СтрокаТП.Текст = Сообщение.Текст;
СтрокаТП.Дата = Сообщение.ДатаПолучения;
// Перебираем вложения письма
Для каждого Вложение Из Сообщение.Вложения Цикл
Вложение.Данные.Записать(Вложение.Наименование);
//Запоминаем имена вложение прикрепленных к данному письму, и сохраним в ТабличноеПоле1
Влож=Влож+Вложение.Наименование+",";
КонецЦикла;
СтрокаТП.ПутьВложения=Влож;
КонецЦикла;
//отключение
Почта.Отключиться();
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Текст = "текст сообщения";
Сообщение.Отправитель = "petya@pupkin.com";
Сообщение.Тема ="Тема сообщения";
Сообщение.Получатели.Добавить("vasya@pupkin.com");
Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Почта = Новый Почта;
//подключаемся без параметров, к клиенту установленному по умолчанию в системе
Почта.Подключиться(,);
Попытка
//Пытаемся послать письмо
Почта.Послать(Сообщение,Истина);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//отключение
Почта.Отключиться();
Функция ПолучитьПрофиль()
Профиль = Новый ИнтернетПочтовыйПрофиль;
// SMTP сервер
Профиль.АдресСервераSMTP = "smtp.pupkin.com";
// Порт SMTP сервера
Профиль.ПортSMTP = 25;
// POP3 сервер
Профиль.АдресСервераPOP3 = "pop.pupkin.com";
// Порт POP3 сервера
Профиль.ПортPOP3 = 110;
// Пароль к почтовому ящику
Профиль.Пароль = "pass";
// Пароль пользователя для SMTP сервера
Профиль.ПарольSMTP = "pass";
// Логин пользователя
Профиль.Пользователь = "vasya";
// Логин пользователя для SMTP сервера
Профиль.ПользовательSMTP = "vasya";
// Время ожидания выполнения операции в секундах
Профиль.ВремяОжидания = 50;
Возврат Профиль;
КонецФункции
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Заголовки=Почта.ПолучитьЗаголовки()
Если Заголовки.Количество()=0 Тогда
Предупреждение("В почтовом ящике нет входящих сообщений!", ,"Нет сообщений");
КонецЕсли;
// Загрузка сообщений в массив
Сообщения = Почта.Выбрать(Истина,Заголовки);
Для каждого Сообщение Из Сообщения Цикл
СтрокаТП = ТабличноеПолеИнтернетПочта.Добавить();
СтрокаТП.Дата = Сообщение.ДатаОтправления;
СтрокаТП.ОтКого = Сообщение.Отправитель.Пользователь + " <" + Сообщение.Отправитель.Адрес + "> ";
СтрокаТП.Тема = Сообщение.Тема;
// Перебираем получателей сообщения
Для каждого Получатель Из Сообщение.Получатели Цикл
КомуВходящие = КомуВходящие + Получатель.Пользователь + " <" + Получатель.Адрес + "> ";
КонецЦикла;
СтрокаТП.Кому = КомуВходящие;
// Перебираем тексты сообщения
Для каждого ТекстСообщения Из Сообщение.Тексты Цикл
ТекстВходящие = ТекстВходящие + ТекстСообщения.Текст;
КонецЦикла;
СтрокаТП.Текст = ТекстВходящие;
// Перебираем вложения письма
Для каждого Вложение Из Сообщение.Вложения Цикл
Вложение.Данные.Записать(Вложение.Name);
СправочникВложения.РеквизитВложение = новый ХранилищеЗначения(Новый ДвоичныеДанные(Вложение.Name));
СправочникВложения.ИмяВложения=Вложение.Name;
КонецЦикла;
КонецЦикла;
// отключение
Почта.Отключиться();
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Сообщение.Отправитель = "vasya@pupkin.com";
Сообщение.ИмяОтправителя = "Вася";
ПочтовыеАдреса = Сообщение.Получатели;
ПочтовыйАдрес = ПочтовыеАдреса.Добавить();
ПочтовыйАдрес.Адрес = "petya@pupkin.com";
Сообщение.Тема ="Тема сообщения";
ИнтернетТекстПочтовогоСообщения = Сообщение.Тексты.Добавить();
ИнтернетТекстПочтовогоСообщения.Текст = "Текст сообщения";
ИнтернетТекстПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Попытка
// Пытаемся послать письмо
Почта.Послать(Сообщение);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
// отключение
Почта.Отключиться();
написать процедуру отправки сообщения в общем модуле можно?
Пишу так:
Процедура УведомлениеПоПочте() ЭКСПОРТ
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Текст = "У Вас есть новая задача!";
Сообщение.Отправитель = "1С Документооборот";
Сообщение.Тема ="Новая задача!";
Сообщение.Получатели.Добавить("kos.dn@mail.ru");
//Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Почта = Новый Почта;
//подключаемся без параметров, к клиенту установленному по умолчанию в системе
Почта.Подключиться(,);
Попытка
//Пытаемся послать письмо
Почта.Послать(Сообщение,Истина);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//отключение
Почта.Отключиться();
КонецПроцедуры
kosalex, вы опять, наверно, хотите набить 30 постов, прежде чем скажете, что пишите это в серверном модуле и выяснится, что там это писать нельзя.
говорит.
я не такой великий спец в 1С как Вы.
в синтаксис помощник смотрю.
вот у меня вроде ошибки нет, а не работает. письмо на почту не приходит.
Функция ПолучитьПрофиль()
Профиль = Новый ИнтернетПочтовыйПрофиль;
// SMTP сервер
Профиль.АдресСервераSMTP = "smtp.mail.ru";
// Порт SMTP сервера
Профиль.ПортSMTP = 25;
// POP3 сервер
Профиль.АдресСервераPOP3 = "pop.mail.ru";
// Порт POP3 сервера
Профиль.ПортPOP3 = 110;
// Пароль к почтовому ящику
Профиль.Пароль = "******";
// Пароль пользователя для SMTP сервера
Профиль.ПарольSMTP = "******";
// Логин пользователя
Профиль.Пользователь = "kos.dn";
// Логин пользователя для SMTP сервера
Профиль.ПользовательSMTP = "kos.dn";
// Время ожидания выполнения операции в секундах
Профиль.ВремяОжидания = 50;
Возврат Профиль;
КонецФункции
Процедура УведомлениеПоПочте() ЭКСПОРТ
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(ПолучитьПрофиль());
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Сообщение = Новый ИнтернетПочтовоеСообщение;
//Сообщение.Вложения.Добавить(Новый ДвоичныеДанные("C:\file.jpg"),"file.jpg");
Сообщение.Отправитель = "1С Документооборот";
//Сообщение.ИмяОтправителя = "Вася";
ПочтовыеАдреса = Сообщение.Получатели;
ПочтовыйАдрес = ПочтовыеАдреса.Добавить();
ПочтовыйАдрес.Адрес = "kos.dn@mail.ru";
Сообщение.Тема ="Новая задача!";
ИнтернетТекстПочтовогоСообщения = Сообщение.Тексты.Добавить();
ИнтернетТекстПочтовогоСообщения.Текст = "У Вас есть новая задача!";
ИнтернетТекстПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Попытка
// Пытаемся послать письмо
Почта.Послать(Сообщение);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
// отключение
Почта.Отключиться();
КонецПроцедуры
Сообщить(ОписаниеОшибки());
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
Доброе утро.
Ошибка:
{ОбщийМодуль.УведомитьПоПочте.Модуль(40)}: Ошибка при вызове метода контекста (Подключиться): Ошибка при попытке соединения с сервером "smtp.mail.ru:25" (10065)
В функции ПолучитьПрофиль() все данные по моему введены корректно. Что то не дописал или переписал?)
Подумал,поискал, и нашёл страндартный общий модуль в типовой конф Документооборот в котором уже реализовано отправления сообщения.
Код:
Функция ОтправитьСообщение(знач УчетнаяЗапись, знач ПараметрыПисьма) Экспорт
Возврат ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
КонецФункции
Функция ОтправитьПочтовоеСообщение(знач УчетнаяЗапись,
знач ПараметрыПисьма) Экспорт
Если ТипЗнч(УчетнаяЗапись) <> Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты")
ИЛИ НЕ ЗначениеЗаполнено(УчетнаяЗапись) Тогда
ВызватьИсключение НСтр("ru = 'Учетная запись не заполнена или заполнена не правильно'");
КонецЕсли;
Если ПараметрыПисьма = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Не заданы параметры отправки.'");
КонецЕсли;
Кому = "";
Если ПараметрыПисьма.Свойство("Кому", Кому) Тогда
Если ТипЗнч(Кому) = Тип("Строка") Тогда
ПараметрыПисьма.Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому);
КонецЕсли;
Иначе
ВызватьИсключение НСтр("ru = 'Не указан ни один получатель письма.'");
КонецЕсли;
Копии = "";
Если ПараметрыПисьма.Свойство("Копии", Копии) Тогда
Если ТипЗнч(Копии) = Тип("Строка") Тогда
ПараметрыПисьма.Копии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Копии);
КонецЕсли;
КонецЕсли;
СлепыеКопии = "";
Если ПараметрыПисьма.Свойство("СлепыеКопии", СлепыеКопии) Тогда
Если ТипЗнч(СлепыеКопии) = Тип("Строка") Тогда
ПараметрыПисьма.СлепыеКопии = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СлепыеКопии);
КонецЕсли;
КонецЕсли;
АдресОтвета = Неопределено;
// проверяем правильную заполненность АдресаОтвета
Если ПараметрыПисьма.Свойство("АдресОтвета", АдресОтвета) Тогда
ПараметрыПисьма.АдресОтвета = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(АдресОтвета);
КонецЕсли;
Вложения = Неопределено;
Если ПараметрыПисьма.Свойство("Вложения", Вложения) Тогда
Для Каждого Вложение Из Вложения Цикл
Если ТипЗнч(Вложение.Значение) = Тип("Строка") Тогда
Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
Вложения.Вставить(Вложение.Ключ, ПолучитьИзВременногоХранилища(Вложение.Значение));
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПараметрыПисьма.Вложения = Вложения;
КонецЕсли;
Возврат ОтправитьСообщение(УчетнаяЗапись, ПараметрыПисьма);
КонецФункции
kosalex, если вопросов по конкретно этой теме нету - создавайте новую тему и там спрашивайте!
А как именно imap позволяет обмениваться исходящими сообщениями?
т.е. какая должна быть команда?
imap хавает только последнее отправленное сообщение или он синхронизирует все, что было уже отправлено? (где он тогда видит, что уже было отправлено)...
Есть ли команды, которые позволяют просмотреть, прошел ли обмен? Прошла ли синхронизация?
Конкретно сейчас грабли с http://pro1c.org.ua/redirect.php?https://webmail.adm.tools . Знаю, что оногда поддержку imap необходимо отдельно включаться. Где включать - не нашел...
Спасибо!
Разобрались:
Почта = Новый ИнтернетПочта;
Почта.Послать(... , ...., ПротоколИнтернетПочты.IMAP); // отаке мусить бути...
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua