Форум » GUI » получение почты из Harbour-программы » Ответить

получение почты из Harbour-программы

gustow: Нет ли у кого опыта получения почты с аттачами из 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) моей проге надо: а) законнектиться (умею); б) залогиниться (умею); в) получить кол-во писем в ящике (умею); ... вот дальше пока не получается ... г) прочитать первое из новых писем (кстати, как определить "новизну" письма?); д) если есть аттачи - и именно четыре нужных экселки - сохранить их в определенную папку; е) если есть еще новые письма - перейти к следующему письму; ж) если нет - отлогиниться, закрыть сессию и выйти (умею). Небольшой пример, что уже получается: [more] [pre2]компилируется как: call c:\MiniGUI\Batch\Compile.bat GrippMail /l tip --------- дальше собственно код -------- local oMail, cUrl, oUrl, oClient, txt cUrl := "pop://gripptest:gripptest@26.188.255.166" if empty( alltrim( cUrl ) ) MsgInfo( "Invalid (empty) URL: " + cUrl ) Return Nil endif oUrl := tURL():New( cUrl ) if empty( oUrl ) MsgInfo("oUrl -- Invalid URL : [ " + cUrl + " ]") Return Nil else MsgInfo("oUrl created!") endif oClient := TIpClientPop():new( oUrl ) if empty( oClient ) MsgInfo("oClient -- Invalid URL : [ " + cUrl + " ]") Return Nil else MsgInfo("oClient created!") endif oClient:nConnTimeout := 2000 //:= 20000 oUrl:cUserid := strtran( oUrl:cUserid, "&at;", "@" ) if oClient:Open() if empty( oClient:cReply ) MsgInfo( "Connecting to " + oUrl:cProto + "://" + oUrl:cServer + CRLF + ; "Connection status: <connected>" ) else MsgInfo( "Connecting to " + oUrl:cProto + "://" + oUrl:cServer + CRLF + ; "Connection status: " + oClient:cReply ) endif txt := "oClient:isOpen = " + iif( oClient:isOpen, ".T.", ".F." ) MsgInfo( txt ) // в моем случае (пока) дает "-1" и "0" txt := "oClient:nLength = " + ltrim(str( oClient:nLength )) + CRLF + ; "oClient:nRead = " + ltrim(str( oClient:nRead )) MsgInfo( txt ) // в моем случае дает "+ОК " + (кол-во писем) + (кол-во октетов)(длина) txt := "oClient:Stat() = " + oClient:Stat() MsgInfo( txt ) // дает как строку (для всех писем через CRLF): // ("номер письма" "длина") (типа "1 32452" + CRLF ) txt := "oClient:List() = " + CRLF + oClient:List() MsgInfo( txt ) txt := "Количество писем в ящике ( oClient:countMail ): " + ; ltrim(str( oClient:countMail )) // почему-то дает на 1 больше MsgInfo( txt ) // запрашивает "unique ID" (без параметра - _всех_ писем) // возвращает строку (разделенную CRLF - если _всех_ писем) // (внутри подстроки - в виде // "1 MD50000000001:MSG:18386:30041174:1176554496" ) txt := "oClient:UIDL( ) = " + CRLF + oClient:UIDL( ) MsgInfo( txt ) // для одного письма возвращает только UIDL ( "MD5..." ) txt := "oClient:UIDL( 1 ) = " + CRLF + oClient:UIDL( 1 ) MsgInfo( txt ) // METHOD Read( nLen ) CLASS tIPClientPOP // ... // RETURN ::Retrieve( Val( ::oUrl:cFile ), nLen ) txt := 'valtype( oClient:Read( 1 ) ) = "' + valtype( oClient:Read( 1 ) ) + '"' MsgInfo( txt ) // пытаемся получить текст определенного письма (1-го) txt := "oClient:Read( oClient:UIDL( 1 ) ) = " + CRLF + ; "--- start --" + CRLF + ; oClient:Read( oClient:UIDL( 1 ) ) + CRLF + ; "--- finish ---" MsgInfo( txt ) // ? выдает то же, что и по List() // ? как прочитать конкретное письмо, имея его UIDL ?? /* // через Retrieve (2-е письмо, первые 100 байт) txt := "oClient:Retrieve( 2, 100 ) = " + CRLF + ; "--- start --" + CRLF + ; oClient:Retrieve( 2, 100 ) + CRLF + ; "--- finish ---" MsgInfo( txt ) // "Касперский Мэйл-Диспетчер" возбудился - // т.е. письмо действительно получили // но... полученное через Retrieve - пустая строка (??) видать, это объект */ /* // через Retrieve (2-е письмо, все целиком сколько ни есть) txt := "oClient:Retrieve( 2 ) = " + CRLF + ; "--- start --" + CRLF + ; oClient:Retrieve( 2 ) + CRLF + ; "--- finish ---" MsgInfo( txt ) // "Касперский Мэйл-Диспетчер" возбудился - // т.е. письмо действительно получили // но... полученное через Retrieve - пустая строка (??) видать, это объект */ // через Retrieve (2-е письмо, все целиком сколько ни есть) - смотрим тип txt := 'valtype( oClient:Retrieve( 2 ) ) = "' + ; valtype( oClient:Retrieve( 2 ) ) + '"' MsgInfo( txt ) // тип - "С" // ... тут эксперимент прервал, ибо жрать охота и домой пора // закрываем сессию (обязательно!) oClient:Quit() // см. HBTIP\POPCLI.PRG // а так - не вылетает! (все завершается чисто... вроде бы...) oClient:Close() MsgInfo( "Session closed." + CRLF + "Done: " + ; iif( empty( oClient:cReply ), ; "(no goodbye message)", ; 'goodbye message "' + oClient:cReply + '"' ) ) else if empty( oClient:cReply ) MsgInfo( "Can't open URI " + cUrl ) else MsgInfo( "Can't open URI " + cUrl + CRLF + ; 'oClient:Reply = "' + oClient:cReply + '"') endif endif MsgInfo( "That's all folks!" ) oMail := .F. cUrl := .F. oUrl := .F. oClient := .F. ---------- конец собственно кода -------------[/pre2][/more] Кто в данной тематике продвинут - подскажите, пожалуйста. И срочно! Пользую HMG Ext 1.7.75-76 Harbour 2.0.0beta3 (Rev.12849) Помогшему (помогшим) - антигриппозную маску в подарок! :)

Ответов - 70, стр: 1 2 3 4 All

Петр: gustow пишет: oClient:Read( oClient:UIDL( 1 ) ) Тут у вас что-то не то написано д) если есть аттачи - и именно четыре нужных экселки - сохранить их в определенную папку; Для работы с письмами предназначен класс TipMail - у него есть соответствующие методы

gustow: Петр, спасибо за отклик - а то что-то тишина была (видать, никто с этим не работал). Насчет oClient:Read( oClient:UIDL( 1 ) ) - хотел выяснить, что делает функция READ() (почему-то сперва посчитал, что так могу выяснить, читано ли уже письмо прежде... мне же надо определять, какие письма новые... только погодя понял, что не так это надо делать - на сервере ж не хранится какая-либо пометка, что письмо уже кем-то скачивалось с POP-сервера... или я неправ?). Про класс TipMail тоже уже знаю (теперь) - сейчас постепенно документирую библиотеку TIP (по исходникам с CVS) (для себя и кто заинтересуется из харбористов). А то про почту народ в основном интересуется "как отослать письмо из Харбор-программы?"... Это-то как раз в один плевок :) - Hb_SendMail () из этой же библиотеки... А вот с получением почты (да еще с "разгребанием" аттачей) - видать, мало кому интересно.

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


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

gfilatov: gustow пишет: как достучаться до ящика, получить кол-во писем, получить RFC-822 от конкретного письма Попробовал добавить в Ваш пример использование класса TipMail, как предлагал Петр. Но при обработке письма получаю ошибку в функции HB_RegEx, которая вызывается из библиотеки tip. #include "minigui.ch" #define APP_TITLE "Hello World!" /* */ Function Main DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE APP_TITLE ; MAIN @ 10,10 BUTTONEX BTNOK ; CAPTION "Get Mails" ; ACTION Fun_1() ; WIDTH 100 HEIGHT 30 @ 45,10 BUTTONEX BTNCANCEL ; CAPTION "Cancel" ; ACTION ThisWindow.Release ; WIDTH 100 HEIGHT 30 END WINDOW CENTER WINDOW Win_1 ACTIVATE WINDOW Win_1 Return *------------- function Fun_1 () local cServer, cUser, cPass, cUrl, oUrl, oClient, nMsgs, ; cMail, oMail, cData, txt, i cServer := "pop.myhome.com" // your POP3-server (DNS-name or IP address) cUser := "testuser" // if your Email-adress is "testuser@myhome.com" cPass := "12345678" // password for your account on POP-server cUrl := "pop://" + cUser + ":" + cPass + "@" + cServer // or simple // cUrl := "pop://testuser:testpass@myhome.com" // ( look at \hbtip\tests\tiptest.prg ) if empty( alltrim( cUrl ) ) // error: empty URL Return Nil endif oUrl := tURL():New( cUrl ) if empty( oUrl ) // error: invalid URL Return Nil endif oClient := TIpClientPop():new( oUrl ) if empty( oClient ) // error: invalid URL Return Nil endif oClient:nConnTimeout := 10000 // connection timeout oUrl:cUserid := strtran( oUrl:cUserid, "&at;", "@" ) // user ID if oClient:Open() txt := "Connecting to " + oUrl:cProto + "://" + oUrl:cServer + CRLF + ; "Connection status: " if empty( oClient:cReply ) MsgInfo( txt + "<connected>" ) // MsgInfo() - function from MiniGUI else MsgInfo( txt + oClient:cReply ) endif nMsgs := oClient:countMail // oops!.. It returns greater on 1 value (for example: not 3 but 4) nMsgs -- // :) let's correct this mistake txt := iif( nMsgs > 0, ; "You have (total) " + ltrim(str(nMsgs)) + ; " message(s) into your mailbox.", ; "Sorry, no mail into your mailbox..." ) MsgInfo( txt ) if nMsgs > 0 /* getting Header (RFC-822) from 1st mail into mailbox cHeader := alltrim( oClient:Top( 1 ) ) // getting substring ( after "Subject:" to CHR(13)+CHR(10) ) i := at( "Subject:", cHeader ) cSubject := substr( cHeader, i+8 ) // len("Subject:") = 8 i := at( chr(13)+chr(10), cSubject ) cSubject := substr( cSubject, 1, i ) if len( cSubject ) > 1 cSubject := alltrim( substr( cSubject, 1, len(cSubject)-1 ) ) else cSubject := "" endif MsgInfo( '"Subject" of 1st mail: [ ' + cSubject + ' ]' ) */ // MsgInfo( oClient:UIDL( 1 ), "UIDL" ) oClient:reset() cMail := oClient:retrieve( 1 ) msginfo( cMail ) oMail := TipMail():New() IF oMail:FromString( cMail ) == 0 MsgInfo( "Malformed mail. Dumping up to where parsed" ) ENDIF //msginfo( oMail:isMultiPart() ) //msginfo( oMail:countAttachments(), "count" ) WITH OBJECT oMail // "-------------============== HEADERS =================--------------" FOR i := 1 TO Len( :hHeaders ) MsgInfo( str(hb_HKeyAt( :hHeaders, i ))+ ":"+ hb_HValueAt( :hHeaders, i ) ) NEXT // "-------------============== RECEIVED =================--------------" FOR EACH cData IN :aReceived MsgInfo( cData, "Received" ) NEXT // "-------------============== BODY =================--------------" IF !Empty( cMail ) MsgInfo( :GetBody(), "Body" ) ENDIF i := 1 DO WHILE :GetAttachment() != NIL // "-------------============== ATTACHMENT =================--------------" MsgInfo( :NextAttachment():GetBody(), "Attachment"+str(i) ) i++ ENDDO END endif oClient:Quit() // look at HBTIP\POPCLI.PRG // no run-time error! // but _without_ this ( with oClient:Close() only ) I had it... oClient:Close() MsgInfo( "Session closed." + CRLF + "Done: " + ; iif( empty( oClient:cReply ), ; "(no goodbye message)", ; 'goodbye message "' + oClient:cReply + '"' ) ) else if empty( oClient:cReply ) MsgInfo( "Can't open URI " + cUrl ) else MsgInfo( "Can't open URI " + cUrl + CRLF + ; 'oClient:Reply = "' + oClient:cReply + '"') endif endif MsgInfo( "That's all folks!" ) cUrl := Nil oUrl := Nil oClient := Nil Return Nil gustow, Может, Вам повезет больше...

gustow: Спасибо за тест, Григорий! Завтра покопаюсь (я до конкретной работы с письмом - т.е. уже загрузив его через 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." Пока не знаю, поддаваться ли на "провокацию" :) - но, глядишь, чем-то и поможет (доками по библиотеке, примерами и пр.)

gfilatov: gustow пишет: А в остальном - все в примере достаточно грамотно? Да, иначе не достучался бы до pop-сервера gustow пишет: Rafael Luiz - сказал, что может подмочь... но призвал перейти на xHarbour+hwgui Ну, это - его стандартное предложение... Minigui ему абсолютно не нравится, поскольку не использует ООП gustow пишет: не знаю, поддаваться ли на "провокацию" Поддайтесь - хуже не будет

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

gustow: Andrey , дык завсегда пожалуйста (мои "два цента" в общий "лимон" :) ). Надеюсь, постепенно разберусь (сам - да и "с маленькой помощью друзей"), Help&Manual сляпается - и всем будет щазззтье! :) от расширения функционала. Григорий , понял, где и почему рушится (у меня тоже - на HMG Ext 1.7.75-76 Harbour 2.0.0beta3 (Rev.12849) ). У вас там небольшая ошибочка в коде: [pre2]WITH OBJECT oMail // "-------------============== HEADERS =================--------------" FOR i := 1 TO Len( :hHeaders ) MsgInfo( str(hb_HKeyAt( :hHeaders, i ))+ ":"+ hb_HValueAt( :hHeaders, i ) ) NEXT[/pre2] Не рушится, если писать hb_HKeyAt без str( ... ) (и вынеся его в заголовок MsgInfo-окна) - т.е. так: [pre2]WITH OBJECT oMail // "-------------============== HEADERS =================--------------" FOR i := 1 TO Len( :hHeaders ) MsgInfo( hb_HValueAt( :hHeaders, i ), hb_HKeyAt( :hHeaders, i ) + ":" ) NEXT[/pre2] И теперь еще "глупый" вопрос (что-то никак не пойму): ну хорошо, аттачи в письме есть (oMail:countAttachments() # 0), могу любой из них получить - как в Вашем добавлении: [pre2] DO WHILE :GetAttachment() != NIL MsgInfo( :NextAttachment():GetBody(), "Attachment"+str(i) ) ENDDO[/pre2] ...а как мне получить список имен файлов в аттачах? (или где посмотреть? в массиве oMail:aAttachments ?) - чтобы можно было анализировать "то пришло, что надо, или не то?", а затем к тому, что надо, применять метод Detach(), задавая путь для "сохранения файла в..."

gfilatov: gustow пишет: как мне получить список имен файлов в аттачах? Для этого есть METHOD getFileName(), который вызывается внутри detachFile( cPath )

gustow: Григорий, я вроде как нашел баг в TIP.LIB, в модуле MAIN.PRG Порождает runtime error вида [pre2] Error BASE/1108 Argument error: HB_AT</p><BR> Called from HB_AT(0) Called from TIPMAIL:FROMSTRING(391) [/pre2] при разборе писем (как я вроде бы понял - только когда письмо с аттачами). Чтобы не повторяться, гляньте мой пост на HMGforum http://hmgforum.com/viewtopic.php?f=20&t=979 Можете это поправить в своем варианте TIP.LIB (или Вы ее не пересобираете для HMG Ext.?) - или сообщать в Harbour Bugreport (т.е. Luiz'у)? Для примера (пример сегодня прислал Luiz): [pre2] 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() [/pre2]вот в [pre2]oMail:FromString( cTmp )[/pre2] и вылетает.

gfilatov: gustow пишет: я вроде как нашел баг в TIP.LIB Текст в модуле MAIL.PRG Харбора повторяет тот же текст из этого модуля xHarbourа Могу сказать одно: в хХарборе прием почты с вложением(ями) работает корректно После небольших танцев с бубнами удалось корректно сохранить архив из письма, используя xHarbour Кстати, в xHarbour отсутствуют и две замеченные Вами проблемы: - nMsgs := oClient:countMail возвращает корректное число писем - oClient:Quit() абсолютно не требуется И, последнее, я выложил на английском форуме МиниГуи рабочую сборку библиотеки для xHarbour, которая включает xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6633)

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

Петр: gfilatov пишет: oClient:Quit() абсолютно не требуется Что вы имеете ввиду?

gfilatov: Петр пишет: 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() не требуется

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

Петр: Вот этим COMPILE.BAT и пользуйтесь, просто укажите в строке 129 if "%MG_XHRB%"=="" set MG_XHRB=c:\xharbour правильный путь к xHb и компилируйте программу compile /X /C Вы что реально решились менять компилятор и из-за чего? P.S. строка 129 находится в \MiniGUI\BATCH\Compile.Bat

gustow: Спасибо, Петр, за подсказку! Просто действительно "тупой" какой-то сегодня :) Петр пишет: Вы что реально решились менять компилятор и из-за чего? Задачу описывал в начале ветки. Получается такая ерунда (к примеру): Компилирую так: [pre2]call c:\MiniGUI\batch\compile.bat test2 /c /l tip /l xhb[/pre2] [pre2]/* from xHarbour Language Reference Guide (bundled with xHarbour) Class Reference -> TIpClientPop GAL - only reformatting and commenting */ // The example outlines the steps required for retrieving all // eMails from a POP mail server and how to decompose // incoming mail messages. ////#include "minigui.ch" // GAL /// GAL (from "\MiniGUI\Harbour\doc\xhb-diff.txt") #ifndef __XHARBOUR__ #include "xhb.ch" // add xHarbour emulation to Harbour #endif PROCEDURE Main LOCAL oPop, oPart, aParts, oTIpMail, aEmails, i // GAL Local cTmp, aTemp, nMsgs, aItem cSaveFolder := CurDrive() + ":\" + CurDir() + "\tmp\" // куда сохранять set color to "w/b, n/w" cls //oPop := TIpClientPop():new( "pop://mailaccount:password@pop.server.com" ) oPop := TIpClientPop():new( "pop://gtest:gtest@26.188.212.164" ) IF .NOT. oPop:open() ? "Connection error:", oPop:lastErrorMessage() clear type inkey(0) QUIT ELSE //// GAL ? "Connection OK" cTmp := oPop:List() if ! empty( cTmp ) cTmp := strtran( cTmp, chr(13)+chr(10), "|") aTemp := Hb_atokens( cTmp, "|") if empty( atail( aTemp ) ) // List() returns value greater on 1 aTemp := asize( aTemp, len( aTemp ) - 1 ) endif nMsgs := len( aTemp ) ? "nMsgs = " + str( nMsgs ) else ? "No mails" endif ? "oPop:countMail() = " + str( oPop:countMail() ) // return as "List()" // (greater on 1) //// //aEMails := oPop:retrieveAll() GAL commented //// GAL aEmails := array( nMsgs ) for i:=1 to nMsgs aItem := Hb_atokens( aTemp[ i ], ' ') oPop:Reset() //cTmp := oPop:Retrieve( val( aItem[1] ), val( aItem[2] ) ) cTmp := oPop:Retrieve( val( aItem[1] ) ) // as in POPCLN.PRG - "RetrieveAll()" (without 2nd) aEmails[ i ] := TIpMail():new() aEmails[ i ]:FromString( cTmp ) /* тут вылетает Called from HB_REGEX(0) Called from TIPMAIL:GETFIELDOPTION(195) in .\mail.prg Called from TIPMAIL:FROMSTRING(432) in .\mail.prg Called from MAIN(70) in test2.prg --- см. в Roberto'вской (! там правильно по NN строк) HBTIP TIPMAIL:GETFIELDOPTION(195) aMatch := HB_Regex( ";\s*" + cOption +"\s*=\s*([^;]*)", cEnc, .F. ) TIPMAIL:FROMSTRING(432) // se if we have subparts: 431 IF At( "multipart/", Lower( ::GetFieldPart( "Content-Type" ) ) ) > 0 432 cSubBoundary := ::GetFieldOption( "Content-Type", "Boundary" ) */ next i //// oPop:close() clear type inkey(0) //QUIT // GAL досюда доходит нормально // (если не "разбирать" письма через :FromString(), а просто надо список) ENDIF [/pre2] И, к примеру, когда компилирую под Харбором (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 эти классы и их методы отрабатывают корректно"... вот и хочу попробовать (мне, в общем-то и надо "просто консоль", без минигуивских наворотов).

gfilatov: gustow пишет: У Григория получался тот же вылет Да, подтверждаю gustow пишет: в xHarbour'e эти классы и их методы отрабатывают корректно Да, подтверждаю gustow пишет: вот и хочу попробовать Ждем отчета о результатах...

gustow: Как писано в "Евгении Онегине": "Еще страшней! Еще чуднее!..." :) скомпилировал как [pre2]call c:\MiniGUI\batch\compile.bat test2 /x /c /l tip[/pre2] Экран (фон DOS-окна) черный (должен быть "белое на синем"), "? ..." не отображаются, на INKEY(0) не реагирует, почта не забирается ("Касперский Почтовый Антивирус" не вылезает - а при Harbour'е "вылезал" на :Retrieve() ). Реагирует только на Ctrl/C (закрывая окно) - и то хотя бы... :) Что делаю не так? (или не доделываю) P.S. Никаких добавок, SETов в AUTOEXEC'ах и др. подобного против установок, что были при "нормальной" работе с Harbour+MiniGUI, не вписывал - "просто добавил воды" :) (т.е. поставил xHarbour в c:\xHarbour).



полная версия страницы