Имя: Пароль:
1C
1С v8
Обработка разбора вложений из почты. Не подскажете где найти?
0 Кокос
 
03.06.13
11:52
Вроде видел в типовой УТ11 пару лет назад, а теперь найти не могу. Тупой перебор почты на наличие файлов и их сохранение для разбора.
1 Vladal
 
03.06.13
12:35
(0) Навскидку - УПП, УТ, УТП..

В самописке я писал так:

Процедура ПрочитатьСообщениеСИзменениями() Экспорт
   
   РасширениеZIP = ".zip";
   РасширениеXML = ".xml";
   
   // Имя временного файла
   Каталог = КаталогВременныхФайлов() + Константы.КодБД.Получить();
   СоздатьКаталог(Каталог);
   ПутьФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\");
   ИмяФайла  = "Discounts_" + СокрЛП(Ссылка.Код) + "_" + СокрП(ПланыОбмена.Филиалы.ЭтотУзел().Код);
   
   // Читаем почту и загружаем файл
   ПрофильПочты = Новый ИнтернетПочтовыйПрофиль;
   ПрофильПочты.АдресСервераPOP3 = Константы.ПочтаАдресСервераPOP3.Получить();
   ПрофильПочты.ПортSMTP         = Константы.ПочтаПортSMTP.Получить();
   ПрофильПочты.ПользовательSMTP = Константы.ПочтаПользовательSMTP.Получить();
   ПрофильПочты.ПарольSMTP       = Константы.ПочтаПарольSMTP.Получить();
   ПрофильПочты.АдресСервераSMTP = Константы.ПочтаАдресСервераSMTP.Получить();
   ПрофильПочты.ПортPOP3         = Константы.ПочтаПортPOP3.Получить();
   ПрофильПочты.Пользователь     = Константы.ПочтаПользователь.Получить();
   ПрофильПочты.Пароль           = Константы.ПочтаПароль.Получить();
   ПрофильПочты.ВремяОжидания    = Константы.ПочтаВремяОжидания.Получить();
   
   Почта = Новый ИнтернетПочта;
   Попытка
       Почта.Подключиться(ПрофильПочты);
   Исключение
       //Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   Попытка
       Заголовки = Почта.ПолучитьЗаголовки();
   Исключение
       //Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   //Если Заголовки.Количество() = 0 Тогда
   //    //ОбщегоНазначения.СообщитьИнформацию("В почтовом ящике нет входящих сообщений!");
   //    Возврат;
   //КонецЕсли;
   
   // Загрузка сообщений в массив, сначала только загрузка, после импорта удалим
   Сообщения = Почта.Выбрать(Ложь, Заголовки); // Ложь чтобы оставались письма в ящике
   
   КоличествоПисем = Сообщения.Количество()-1;
   Для Индекс = 0 По КоличествоПисем Цикл
       
       Сообщение = Сообщения[Индекс];
       // ВЛ - 2012-06-10 - Переделал, чтобы обработанные письма удалялись из ящика.
       //// Пропустим только почту за последние 3 дня
       //ГлубинаПроверки = Константы.ПочтаГлубинаПроверки.Получить();
       //Если НачалоДня(ТекущаяДата()) - НачалоДня(Сообщение.ДатаОтправления) > ГлубинаПроверки * 60*60*24 Тогда
       //    Продолжить;
       //КонецЕсли;
       
       // Отсев ненужных писем по теме сообщения
       Если Сообщение.Тема <> ИмяФайла + РасширениеXML Тогда
           Продолжить;
       КонецЕсли;
       
       // Читаем вложения каждого письма и сверяем с ожидаемым именем для этого узла обмена
       Для каждого Вложение Из Сообщение.Вложения Цикл
           
           Если Вложение.ИмяФайла <> ИмяФайла + РасширениеZIP Тогда
               Продолжить;
           КонецЕсли;
           
           ИмяФайлаВложения = ПутьФайла + ИмяФайла + РасширениеZIP;
           ДанныеОбмена = Вложение.Данные;
           ДанныеОбмена.Записать(ИмяФайлаВложения);
           
           // Распакуем выгруженный ZIP-архив
           ФайлАрхива = Новый ЧтениеZIPФайла(ИмяФайлаВложения, "Discounts");
           ФайлАрхива.ИзвлечьВсе(ПутьФайла, РежимВосстановленияПутейФайловZIP.Восстанавливать);
           ФайлАрхива.Закрыть();
           
           // Работаем с полученным файлом обмена
           ИмяФайлаОбмена = ПутьФайла + ИмяФайла + РасширениеXML;
           Файл = Новый Файл(ИмяФайлаОбмена);
           Если НЕ Файл.Существует() Тогда
               Возврат;
           КонецЕсли;
           
           // Чтение документов XML
           ЧтениеХМЛ = Новый ЧтениеXML;
           Попытка
               ЧтениеХМЛ.ОткрытьФайл(ИмяФайлаОбмена);
           Исключение
               ОбщегоНазначения.СообщитьОбОшибке("" + ТекущаяДата() + " -- " + ОписаниеОшибки());
               Продолжить;
           КонецПопытки;
           
           // Чтение файла
           ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
           Попытка
               ЧтениеСообщения.НачатьЧтение(ЧтениеХМЛ);
           Исключение
               ТекстОшибки = "" + ТекущаяДата() + " -- " + ОписаниеОшибки();
               ОбщегоНазначения.СообщитьОбОшибке(ТекстОшибки);
               
               // Проверка текста ошибки
               Если Найти(ТекстОшибки, "Номер сообщения меньше или равен номеру ранее принятого сообщения") > 0 Тогда
                   
                   // Это сообщение загрузили раньше, но по какой-то причине не удалили
                   УдалитьСообщение(Почта, Сообщения, Индекс);
                   
                   // Закрытие объектов
                   ЧтениеСообщения.ЗакончитьЧтение();
                   ЧтениеХМЛ.Закрыть();
                   УдалитьФайлы(ИмяФайлаОбмена);
                   УдалитьФайлы(ИмяФайлаВложения);
                   Продолжить;
                   //Иначе
                   //    Возврат;
               КонецЕсли;
               
           КонецПопытки;
           
           // Сообщение не предназначено для этого узла
           Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
               ВызватьИсключение "Неверный узел";
           КонецЕсли;
           
           // Читаем данные из сообщения ХМЛ сериализации
           Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
               
               // Удаляем регистрацию изменений для узла отправителя сообщения
               ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);
               Данные = ПрочитатьXML(ЧтениеХМЛ);
               
               // Записать полученные данные
               Попытка
                   Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
                   Данные.ОбменДанными.Загрузка = Истина;
                   Данные.Записать();
               Исключение
                   ОбщегоНазначения.СообщитьОбОшибке("" + ТекущаяДата() + " -- " + ОписаниеОшибки());
                   Возврат;
               КонецПопытки;
               
           КонецЦикла;
           
           // Закрытие объектов
           ЧтениеСообщения.ЗакончитьЧтение();
           ЧтениеХМЛ.Закрыть();
           УдалитьФайлы(ИмяФайлаОбмена);
           УдалитьФайлы(ИмяФайлаВложения);
           
           УдалитьСообщение(Почта, Сообщения, Индекс);
           
       КонецЦикла; // Чтение почтовых вложений
       
   КонецЦикла; // Чтение почтовых сообщений
   
   Почта.Отключиться(); // todo: будет ли читаться СМТП после отключения ПОП3?
   
КонецПроцедуры
2 Vladal
 
03.06.13
12:36
Упс... При копипасте добавились пустые строки.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.