Имя: Пароль:
IT
 
Почтовый клиент
0 ildary
 
16.07.12
15:07
Уважаемые специалисты, посоветуйте пожалуйста, чем лучше принять почту и сохранить вложенный файл на диск (для собственного обмена файлами между подразделениями)? Попробовал TBird с каким-то плагином - и он вроде бы работает как надо, но раз в три дня перестает - т.е. письмо пришло, но правило не отработалось. Хочется чего-то в стиле "поставил и забыл", а не "поставил и мучайся". Никакие шашечки не нужны - главное - скачать письмо и положить файл в папку (не искажая его имя, т.е. если пришло такое же - то затереть предыдущий файл).
1 Ринат-СПб
 
16.07.12
15:39
The Bat
не?
2 ildary
 
16.07.12
15:51
(1) да, бат бы подошел, но ради мелкой задачи покупать такую программу - не совсем правильно.
3 zak555
 
16.07.12
15:53
на почтовом сервер linux ?
4 Ринат-СПб
 
16.07.12
15:54
(2) 1300 руб. для конторы дорого? О_о
ну можно найти и таюлэтку ;)
5 Ринат-СПб
 
16.07.12
15:54
*таблэтку
6 wostroga
 
16.07.12
15:54
ну вот на вскидку..http://www.codeode.com/popclient.html
А можно вообще самому написать :), например вот так http://forum.script-coding.com/viewtopic.php?id=3196
А еще хорошо помогает Гугл, и заметьте, что про Гугл только третьим пунктом! :)
7 Vladal
 
16.07.12
15:55
Вот код, который читает почту и сохраняет вложения, да еще распаковывает запароленные архивы. При успехе - удаляет.
Конструктивная критика и предложения приветствуются.


// Шаблон имени файла обмена - Discounts_XX_YY,
// где XX - код узла обмена отправителя,
//     YY - код узла обмена получателя

Процедура ЗаписатьСообщениеСИзменениями() Экспорт
   
   // Проверка, есть ли данные для обмена
   ЕстьНовые = Ложь;
   ВыборкаДанных = ПланыОбмена.ВыбратьИзменения(Ссылка, НомерОтправленного+1);
   Пока ВыборкаДанных.Следующий() Цикл
       ЕстьНовые = Истина;
       Прервать;
   КонецЦикла;
   
   Если НЕ ЕстьНовые Тогда
       Возврат;
   КонецЕсли;
   
   РасширениеZIP = ".zip";
   РасширениеXML = ".xml";
   
   // Создаём временный файл по маске XX_Discounts.xml, где XX - код текущего филиала
   Каталог = КаталогВременныхФайлов() + Константы.КодБД.Получить();
   СоздатьКаталог(Каталог);
   ПутьФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\");
   ИмяФайла  = "Discounts_"
             + СокрП(ПланыОбмена.Филиалы.ЭтотУзел().Код)
             + "_"
             + СокрЛП(Ссылка.Код);
   
   // Запись XML
   ЗаписьХМЛ = Новый ЗаписьXML;
   ЗаписьХМЛ.ОткрытьФайл(ПутьФайла + ИмяФайла + РасширениеXML);
   ЗаписьХМЛ.ЗаписатьОбъявлениеXML();
   
   // Инфраструктура сообщений
   ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
   ЗаписьСообщения.НачатьЗапись(ЗаписьХМЛ, Ссылка);
   
   // Получить выборку измененных данных
   ВыборкаИзменения = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
   Пока ВыборкаИзменения.Следующий() Цикл
       ЗаписатьXML(ЗаписьХМЛ, ВыборкаИзменения.Получить());
   КонецЦикла;
   
   // Закрытие объектов
   ЗаписьСообщения.ЗакончитьЗапись();
   ЗаписьХМЛ.Закрыть();
   
   ЗаписьХМЛ = Неопределено;
   
   // Архивируем
   ФайлАрхива = Новый ЗаписьZipФайла(ПутьФайла + ИмяФайла + РасширениеZIP, "Discounts",,
   МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный);
   ФайлАрхива.Добавить(ПутьФайла + ИмяФайла + РасширениеXML, РежимСохраненияПутейZIP.СохранятьОтносительныеПути);
   ФайлАрхива.Записать();
   ФайлАрхива = Неопределено;
   
   // Отправляем как вложение на почту
   Сообщение = Новый ИнтернетПочтовоеСообщение;
   Сообщение.Тексты.Добавить("Обмен =" + ПланыОбмена.Филиалы.ЭтотУзел().Наименование
                            + "= с =" + Ссылка.Наименование + "=");
   Сообщение.Отправитель = Константы.ПочтаПользовательSMTP.Получить();
   Сообщение.Тема = Имяфайла + РасширениеXML;
   Сообщение.Получатели.Добавить(Константы.ПочтаПользовательSMTP.Получить());
   Сообщение.Вложения.Добавить(Новый ДвоичныеДанные(ПутьФайла + ИмяФайла + РасширениеZIP), ИмяФайла + РасширениеZIP);
   
   ПрофильПочты = Новый ИнтернетПочтовыйПрофиль;
   ПрофильПочты.АдресСервераSMTP = Константы.ПочтаАдресСервераSMTP.Получить();
   ПрофильПочты.ПортSMTP         = Константы.ПочтаПортSMTP.Получить();
   ПрофильПочты.АдресСервераPOP3 = Константы.ПочтаАдресСервераPOP3.Получить();
   ПрофильПочты.ПортPOP3         = Константы.ПочтаПортPOP3.Получить();
   ПрофильПочты.Пароль           = Константы.ПочтаПароль.Получить();
   ПрофильПочты.ПарольSMTP       = Константы.ПочтаПарольSMTP.Получить();
   ПрофильПочты.Пользователь     = Константы.ПочтаПользователь.Получить();
   ПрофильПочты.ПользовательSMTP = Константы.ПочтаПользовательSMTP.Получить();
   ПрофильПочты.ВремяОжидания    = Константы.ПочтаВремяОжидания.Получить();
   
   Почта = Новый ИнтернетПочта;
   Попытка
       Почта.Подключиться(ПрофильПочты);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   Попытка
       Почта.ПолучитьЗаголовки();
   Исключение
       Возврат;
   КонецПопытки;
   
   Попытка
       //Пытаемся послать письмо
       Почта.Послать(Сообщение);
   Исключение
       Сообщить(ОписаниеОшибки());
       Почта.Отключиться();
       Возврат;
   КонецПопытки;
   
   //отключение
   Почта.Отключиться();
   
КонецПроцедуры

Процедура ПрочитатьСообщениеСИзменениями() Экспорт
   
   Расширение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?
   
КонецПроцедуры

Процедура УдалитьСообщение(Почта, Сообщения, Индекс);
8 Vladal
 
16.07.12
15:57
Упс... Ветка не в 1С и тэги не сработали
9 wostroga
 
16.07.12
15:58
(7) Все равно это ВЕЩЬ!!!! мне понравилось :)
10 ildary
 
16.07.12
16:02
(4) для только что открывшегося магазина, которому еще свое открытие отбивать и отбивать - это много. Насчет таблетки - это уже давно не наш метод.

(6) этот самый pop клиент сохраняет все файлы только с уникальными именами (а мне надо, чтобы при совпадении имени вложения - старый файл затирался. также не подходят всякие Dream Mail, FoxMail, Sylpheed - не умеют сохранять вложения. vbs скрипт попробую помучать, спасибо.

(7) спасибо, у нас 7.7.
11 Ринат-СПб
 
16.07.12
16:07
(10) я балдею :)
ладно, мое дело предложить - ваше отказаться :)

З.Ы. У меня стоит Мышь с настроенными правилами, прайсы выгружаются и не парюсь уже года четыре. А 1.3 килорубля - это не цена, ты в кино с девушкой сходишь и то больше можешь оставить :)
12 ildary
 
16.07.12
16:10
(11) во первых - эти деньги не мои, я там не директор, во вторых - неправильно для мелкой задачи покупать большое решение.
13 Ринат-СПб
 
16.07.12
16:17
(12) Сколько тебе заплатят за решение данной задачи? Сколько времени ты потратишь на поиск и решение данной задачи?
По моим критериям - это как раз таки логичное и самое дешевое решение данной задачи. Конечно можешь нанять кодера, напишет тебе программулину для решения этой "маленькой" задачи. Она тебе выполнит только данную задачу и все...
Можешь поискать и протестировать десятки программ, затратив пяток человеко-часов... но ты найдешь прекрасное и бесплатное решение :)))

Сорь за оффтоп :)))
14 wostroga
 
16.07.12
16:17
(11) я тоже балдею по поводу (10)
15 wostroga
 
16.07.12
16:26
хотя в (10) все же было "спасибо"
ладно уж...на здоровье.
16 Vladal
 
16.07.12
17:43
(10) Ну что же, правильно ставь задачу.
Если не указал ветку - опиши проблему в нулевом посте.

Не сделал - напиши ниже, "ребята, я забыл - это для 7.7"
Не написал - сам дурак.

ИМХО.

Для 7.7 есть внешние компоненты работы с почтой, в т.ч. посмотри и v7plus
17 ildary
 
16.07.12
17:46
(16) замечу - я вообще не хотел приплетать в эту задачу 1С, ветка в теме ИТ, писал я про почтовый клиент, а не про обработку 1С или ее ВК.
18 Vladal
 
16.07.12
17:48
(17) Ну, пардоньте
19 Vladal
 
16.07.12
17:48
Используй скрипт - он будет брать твою почту и лепить в файл на диске, затирая существующий.
20 ildary
 
16.07.12
17:50
(19) спасибо, так и поступлю. Только удивляет меня, что такая простая задача, как выгрузка аттача в папку решена только у TheBat.
21 smaharbA
 
16.07.12
17:50
есть клиент от мс командной строки, не скажу как найти, где то на саппортМС
22 Vladal
 
16.07.12
17:54
Есть еще DLL - JMail
http://www.virtualsplat.com/email-sample-code/asp-jmail.asp

К чему прицепишь по COM, там и будет работать - VBS, Delphi, 1C
23 Vladal
 
16.07.12
17:54
(21) По-моему та утилита работает с дефолтным клиентом, и если он от Майкрософт. Могу ошиьбаться
24 milan
 
16.07.12
18:02
(22) +1, давно пользуемся все работает, вские зибаты и прочие аутлуки в топку. Зачем вставлять дополнительное звено, в котором точно возникнет сбой - непонятно
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн