On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 101
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 14.11.09 19:14. Заголовок: получение почты из Harbour-программы


Нет ли у кого опыта получения почты с аттачами из Harbour-программы?

DeleteEmail и CheckMailBox в SAMPLES смотрел, на старте помогло, но... в там используемом классе "Socket" (как понял, во всяком случае) плохо с работой с аттачами... а мне-то как раз с ними работать и надо.

Решил пользовать классы из библиотеки TIP.LIB (ранее HBTIP вроде бы она была), т.е. tURL, TIpClientPop... но с документацией по ним беда (т.е. фактически нету). Вот и разбираюсь постепенно (а поразобравшись - опубликую "накопленный опыт" или как наглядный пример, или как нормальное описание, или как то и другое)...

Стоит такая задача автоматизации (как раз в разрезе "свиняче-гриппозной" эпидемии) (и слепить надо довольно срочно, аж к понедельнику-вторнику, т.е. к 16-17.11.09 - собственно, все остальное ясно как делать, кроме "грамотной" работы с почтовым сервером):

1) наши больницы (Свердловская область 300-400 шт.) будут слать нам (на определенный и им известный адрес) КАЖДЫЙ день по письму, к которому приаттачено 4 XLS-ки (к примеру, для больницы с кодом "015" это будут "a015.xls", "b015.xls", "c015.xls", "d015.xls") с данными, сколько и какого народу заболело-лечится-померло и пр.

2) отчетный период - с 11:00 до 11:00 (т.е. после 11:00 забираем все, что накопилось в ящике "Входящие" на мэйл-сервере - и пусть кидают снова; а мы тем временем - уже другой прогой, это не моя забота - суммируем все по области и высылаем сводку в Минздрав).

3) моей проге надо:

а) законнектиться (умею);
б) залогиниться (умею);
в) получить кол-во писем в ящике (умею);
... вот дальше пока не получается ...
г) прочитать первое из новых писем (кстати, как определить "новизну" письма?);
д) если есть аттачи - и именно четыре нужных экселки - сохранить их в определенную папку;
е) если есть еще новые письма - перейти к следующему письму;
ж) если нет - отлогиниться, закрыть сессию и выйти (умею).

Небольшой пример, что уже получается:
Скрытый текст

Кто в данной тематике продвинут - подскажите, пожалуйста. И срочно!

Пользую HMG Ext 1.7.75-76 Harbour 2.0.0beta3 (Rev.12849)

Помогшему (помогшим) - антигриппозную маску в подарок! :)

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]


постоянный участник


Пост N: 753
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.11.09 21:57. Заголовок: gustow пишет: oClie..


gustow пишет:

 цитата:
oClient:Read( oClient:UIDL( 1 ) )


Тут у вас что-то не то написано

 цитата:
д) если есть аттачи - и именно четыре нужных экселки - сохранить их в определенную папку;


Для работы с письмами предназначен класс TipMail - у него есть соответствующие методы


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 107
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 17.11.09 09:49. Заголовок: Петр, спасибо за отк..


Петр, спасибо за отклик - а то что-то тишина была (видать, никто с этим не работал).

Насчет oClient:Read( oClient:UIDL( 1 ) ) - хотел выяснить, что делает функция READ() (почему-то сперва посчитал, что так могу выяснить, читано ли уже письмо прежде... мне же надо определять, какие письма новые... только погодя понял, что не так это надо делать - на сервере ж не хранится какая-либо пометка, что письмо уже кем-то скачивалось с POP-сервера... или я неправ?).

Про класс TipMail тоже уже знаю (теперь) - сейчас постепенно документирую библиотеку TIP (по исходникам с CVS) (для себя и кто заинтересуется из харбористов).

А то про почту народ в основном интересуется "как отослать письмо из Харбор-программы?"... Это-то как раз в один плевок :) - Hb_SendMail () из этой же библиотеки... А вот с получением почты (да еще с "разгребанием" аттачей) - видать, мало кому интересно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 755
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 17.11.09 12:19. Заголовок: gustow пишет: на се..


gustow пишет:

 цитата:
на сервере ж не хранится какая-либо пометка, что письмо уже кем-то скачивалось с POP-сервера... или я неправ?


Для POP/POP3 - это работа для почтового клиента, которую он может делать в разные способы, вплоть до удаления прочитанного сообщения с сервера.
Наиболее распространенный способ - использование UIDL, клиент сохраняет UIDL в собственной базе и перед чтением письма смотрит, не читалось ли письмо с указанным идентификатором ранее.
UIDL - в теории является уникальным идентификатором, но в целях упрощения алгоритма его часто получают посредством применения алгоритма хеширования (например MD5) к заголовку сообщения. Применение такой технологии может привести к тому, что два одинаковых сообщения могут получить одинаковый UIDL. Почтовый клиент должен уметь распознавать и устранять такие ситуации.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 108
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 17.11.09 15:29. Заголовок: Понял - спасибо за р..


Понял - спасибо за разъяснения (не знал).

Т.ч. как раз и буду делать то, что и собирался, для запоминания "есть ли что непрочитанное?": буду хранить для последнего обработанного письма UIDL, а также (для предотвращения "дубликатов" по MD5) дату и время, когда отправитель его послал, - т.е. "Date:" из RFC-822. И буду либо читать начиная со следующего после последнего обработанного (если буду сохранять письма на сервере - что вряд ли), либо (если такого в списке UIDL'ов для "всех писем" нет) все письма с сервера. Такой способ годится? (просто никогда еще с почтовыми серверами не работал программно)

Поскольку уж начал разбираться с этой библиотекой, то решил хоть какой-то Help сделать (хотя бы то, что уже знаю) - авось и кому другому, кому надо будет такой функционал иметь, пригодится... Если интересно - положил пока одну страничку (но с достаточно полноценным примером: "как достучаться до ящика, получить кол-во писем, получить RFC-822 от конкретного письма, выудить из него содержимое от "Subject:" - т.е. "Тема:" - и показать") на HMGforum.
http://hmgforum.com/viewtopic.php?f=5&t=977

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1096
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 17.11.09 18:30. Заголовок: gustow пишет: как д..


gustow пишет:

 цитата:
как достучаться до ящика, получить кол-во писем, получить RFC-822 от конкретного письма


Попробовал добавить в Ваш пример использование класса TipMail, как предлагал Петр.
Но при обработке письма получаю ошибку в функции HB_RegEx, которая вызывается из библиотеки tip.

Скрытый текст

gustow,
Может, Вам повезет больше...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 109
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 17.11.09 18:44. Заголовок: Спасибо за тест, Гри..


Спасибо за тест, Григорий!
Завтра покопаюсь (я до конкретной работы с письмом - т.е. уже загрузив его через Retrieve - пока не добирался: надо было сперва "гаммы разучить" :) ). А в остальном - все в примере достаточно грамотно? Или есть "ляпы"?

И вообще - хэлп такой полезен будет на Ваш взгляд? (как писал тут не так давно кто-то - "всякая информация полезна" :) )

P.S. На comp.lang.xharbour отозвался Rafael Luiz - сказал, что может подмочь... но призвал перейти на xHarbour+hwgui.
 цитата:
"sure i can help, but you need to use xharbour (where is the real tip library) and also use hwgui as gui library, which is much more stable and easy to use then hmg."

Пока не знаю, поддаваться ли на "провокацию" :) - но, глядишь, чем-то и поможет (доками по библиотеке, примерами и пр.)

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1097
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 17.11.09 19:08. Заголовок: gustow пишет: А в о..


gustow пишет:

 цитата:
А в остальном - все в примере достаточно грамотно?


Да, иначе не достучался бы до pop-сервера

gustow пишет:

 цитата:
Rafael Luiz - сказал, что может подмочь... но призвал перейти на xHarbour+hwgui


Ну, это - его стандартное предложение... Minigui ему абсолютно не нравится, поскольку не использует ООП

gustow пишет:

 цитата:
не знаю, поддаваться ли на "провокацию"


Поддайтесь - хуже не будет

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 965
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.11.09 10:33. Заголовок: gustow пишет: видат..


gustow пишет:

 цитата:
видать, мало кому интересно.



Интересно в любом случае...
Просто не всегда сразу начинаешь пробовать....
Спасибо за пример и хелп к нему ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 110
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 18.11.09 11:09. Заголовок: Andrey , дык завсегд..


Andrey , дык завсегда пожалуйста (мои "два цента" в общий "лимон" :) ).
Надеюсь, постепенно разберусь (сам - да и "с маленькой помощью друзей"), Help&Manual сляпается - и всем будет щазззтье! :) от расширения функционала.

Григорий , понял, где и почему рушится (у меня тоже - на HMG Ext 1.7.75-76 Harbour 2.0.0beta3 (Rev.12849) ).

У вас там небольшая ошибочка в коде:
WITH OBJECT oMail 
// "-------------============== HEADERS =================--------------"
FOR i := 1 TO Len( :hHeaders )
MsgInfo( str(hb_HKeyAt( :hHeaders, i ))+ ":"+ hb_HValueAt( :hHeaders, i ) )
NEXT

Не рушится, если писать hb_HKeyAt без str( ... ) (и вынеся его в заголовок MsgInfo-окна) - т.е. так:
WITH OBJECT oMail 
// "-------------============== HEADERS =================--------------"
FOR i := 1 TO Len( :hHeaders )
MsgInfo( hb_HValueAt( :hHeaders, i ), hb_HKeyAt( :hHeaders, i ) + ":" )
NEXT

И теперь еще "глупый" вопрос (что-то никак не пойму): ну хорошо, аттачи в письме есть (oMail:countAttachments() # 0), могу любой из них получить - как в Вашем добавлении:
 DO WHILE :GetAttachment() != NIL 
MsgInfo( :NextAttachment():GetBody(), "Attachment"+str(i) )
ENDDO

...а как мне получить список имен файлов в аттачах? (или где посмотреть? в массиве oMail:aAttachments ?) - чтобы можно было анализировать "то пришло, что надо, или не то?", а затем к тому, что надо, применять метод Detach(), задавая путь для "сохранения файла в..."

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1098
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 18.11.09 11:47. Заголовок: gustow пишет: как м..


gustow пишет:

 цитата:
как мне получить список имен файлов в аттачах?


Для этого есть METHOD getFileName(), который вызывается внутри detachFile( cPath )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 111
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 18.11.09 17:08. Заголовок: Григорий, я вроде ка..


Григорий, я вроде как нашел баг в TIP.LIB, в модуле MAIN.PRG
Порождает runtime error вида
 Error BASE/1108  Argument error: HB_AT</p><BR> 
Called from HB_AT(0)
Called from TIPMAIL:FROMSTRING(391)
при разборе писем (как я вроде бы понял - только когда письмо с аттачами).

Чтобы не повторяться, гляньте мой пост на HMGforum
http://hmgforum.com/viewtopic.php?f=20&t=979
Можете это поправить в своем варианте TIP.LIB (или Вы ее не пересобираете для HMG Ext.?) - или сообщать в Harbour Bugreport (т.е. Luiz'у)?

Для примера (пример сегодня прислал Luiz):
 oPop := TipClientPOP():New( oUrl1, lTrace ) 
...

// First lets read all messages from server ( i+m not deleting then
//from the pop3 server as i got then)

cTmp := oPop:List()
oPop:Reset()

MsgInfo( cTmp, "oPop:List()" )

if !empty( cTmp )
cTmp := strtran( cTmp, chr(13)+chr(10), "|")
aTemp := Hb_atokens( cTmp, "|")
for each cTemp in aTemp
oPop:Reset()
aItem := Hb_atokens( cTemp, ' ')
cTmp := oPop:Retrieve( val( aItem[1] ), val( aItem[2] ) )
oMail := TipMail():New()
oMail:FromString( cTmp )
aadd( aData, oMail )
next
endif

oPop:Close()
вот в
oMail:FromString( cTmp )
и вылетает.


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1100
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 18.11.09 18:58. Заголовок: gustow пишет: я вро..


gustow пишет:

 цитата:
я вроде как нашел баг в TIP.LIB


Текст в модуле MAIL.PRG Харбора повторяет тот же текст из этого модуля xHarbourа

Могу сказать одно: в хХарборе прием почты с вложением(ями) работает корректно
После небольших танцев с бубнами удалось корректно сохранить архив из письма, используя xHarbour

Кстати, в xHarbour отсутствуют и две замеченные Вами проблемы:
- nMsgs := oClient:countMail возвращает корректное число писем
- oClient:Quit() абсолютно не требуется

И, последнее, я выложил на английском форуме МиниГуи рабочую сборку библиотеки для xHarbour, которая включает
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6633)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 112
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 19.11.09 09:02. Заголовок: Спасибо, Григорий, б..


Спасибо, Григорий, буду разбираться. О результатах (хотелось бы все же - по возможности - не слезать с иглы HMG Ext. :) а то уж втянулся :) ) сообщу.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 759
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.11.09 13:46. Заголовок: Возвращаясь к теме


gfilatov пишет:

 цитата:
oClient:Quit() абсолютно не требуется


Что вы имеете ввиду?

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1104
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 24.11.09 14:06. Заголовок: Петр пишет: gfilato..


Петр пишет:

 цитата:
gfilatov пишет:

oClient:Quit() абсолютно не требуется



Что вы имеете ввиду?


В примере для Харбора Алексей написал

 цитата:

...
oClient:Quit() // look at HBTIP\POPCLI.PRG
// no run-time error!
// but _without_ this ( with oClient:Close() only ) I had it...

oClient:Close()
...


Для хХарбора в аналогичном примере вызов oClient:Quit() не требуется

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 113
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 24.11.09 14:41. Заголовок: Извините, Григорий, ..


Извините, Григорий, но что-то я "устал мозгами"... :)
Скачал xHarbour (последнюю инсталляшку с free.xharbour.com - от 5 ноября), установил (по умолчанию - в c:\xHarbour).
А он, "зараза" (точнее, его xBuild и прочее), не работает под 98-й (под XP-то опробовал - все идет) - ругается на "Файл XBUILDW.EXE связан с отсутствующим компонентом KERNEL32.DLL:GetUserDefaultUILanguage..." и т.п.
Попробовать-то можно - а работать и отлаживать программку (в конторе) надо под 98-й (из неких "политических" соображений).
Но библиотеки-то xHarbour'овские и все его остальное - на месте...
Как мне его подвязать (миниГУИвские компоненты не нужны - делаю просто консоль), чтобы скомпилировать .PRG-шку в EXE? (т.е. нечто вроде COMPILE.BAT в MINIGUI-вских примерах)
Извините, если путано... видать, погода плохая :) Надеюсь, поняли, что хочу.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 760
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.11.09 15:20. Заголовок: Вот этим COMPILE.BAT..


Вот этим COMPILE.BAT и пользуйтесь, просто укажите в строке 129
if "%MG_XHRB%"=="" set MG_XHRB=c:\xharbour
правильный путь к xHb и компилируйте программу compile /X /C

Вы что реально решились менять компилятор и из-за чего?

P.S. строка 129 находится в \MiniGUI\BATCH\Compile.Bat

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 114
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 24.11.09 16:08. Заголовок: Спасибо, Петр, за по..


Спасибо, Петр, за подсказку! Просто действительно "тупой" какой-то сегодня :)

Петр пишет:

 цитата:
Вы что реально решились менять компилятор и из-за чего?



Задачу описывал в начале ветки. Получается такая ерунда (к примеру):

Компилирую так:
call c:\MiniGUI\batch\compile.bat test2 /c /l tip /l xhb


Скрытый текст

И, к примеру, когда компилирую под Харбором (HMG Ext 1.7.76), :countMail() возвращает кол-во писем, большее "истинного" на 1 (т.е. в ящике 3 письма, а возвращает 4)... Ну это-то ладно - поправлю легко (хотя результат от :List() совместно с :countMail() используются в :RetrieveAll() - "получить ВСЕ письма", и тогда при получении якобы "последнего" письма вылетит по ошибке). Хуже-то, что когда начинаю "разбирать письмо" (создавать TipMail-объект и заполнять его из строки через :FromString() ) - в Harbour'е вылетает...

У Григория получался тот же вылет ( http://clipper.borda.ru/?1-1-0-00000205-000-0-0#003.001 ).
Чуть позже Григорий посоветовал: "в xHarbour'e эти классы и их методы отрабатывают корректно"... вот и хочу попробовать (мне, в общем-то и надо "просто консоль", без минигуивских наворотов).

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 1105
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 24.11.09 16:36. Заголовок: gustow пишет: У Гри..


gustow пишет:

 цитата:
У Григория получался тот же вылет


Да, подтверждаю

gustow пишет:

 цитата:
в xHarbour'e эти классы и их методы отрабатывают корректно


Да, подтверждаю

gustow пишет:

 цитата:
вот и хочу попробовать


Ждем отчета о результатах...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 115
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 24.11.09 16:51. Заголовок: Как писано в "Ев..


Как писано в "Евгении Онегине":
"Еще страшней! Еще чуднее!..." :)

скомпилировал как
call c:\MiniGUI\batch\compile.bat test2 /x /c /l tip

Экран (фон DOS-окна) черный (должен быть "белое на синем"), "? ..." не отображаются, на INKEY(0) не реагирует, почта не забирается ("Касперский Почтовый Антивирус" не вылезает - а при Harbour'е "вылезал" на :Retrieve() ). Реагирует только на Ctrl/C (закрывая окно) - и то хотя бы... :)

Что делаю не так? (или не доделываю)

P.S. Никаких добавок, SETов в AUTOEXEC'ах и др. подобного против установок, что были при "нормальной" работе с Harbour+MiniGUI, не вписывал - "просто добавил воды" :) (т.е. поставил xHarbour в c:\xHarbour).

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 381
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет