Форум » 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

AndreyZh: Извините за тон уважаемые господа... и спасибо за посильную помощь! Задача по примеру инструкции казалась легкой, о оказалось "как обычно". Видимо нет сейчас времени глубоко изучать и вникать - отложу задачу до "лучших" времен

Dima: AndreyZh пишет: oUrl := tURL():New( "pop://poseydon2000solprod@yandex.ru:****@pop.yandex.ru" ) тут нужен pop3s Тоже стал разбираться со чтением почты , чекал на mail.ru Не знаю как на яше но на майл ру логин нужно передавать без @mail.ru

Dima: Непонятная порча с чтением темы письма , если оно отправлено с мобилы. В теме забивали *SOS# , читаю в Harbour и получаю =?UTF-8?B?KlNPUyM=?= Если отправлять с компа с такой же темой , то получаю в теме *SOS# Не пойму как такое может быть...

Dima: OnLine декодер распознал однако Как теперь в Harbour раскодировать ?

Dima: Вроде понял как Нужно проанализировать строку на предмет (по шаблону) =?UTF-8?B? Если такая строка есть , то вырезаем ее и после остатку строки делаем hb_base64Decode

Петр: Dima пишет: =?UTF-8?B? Если такая строка есть , то вырезаем ее и после остатку строки делаем hb_base64Decode Не совсем так. =?UTF-8?B?KlNPUyM=?= В этой теме был разбор похожей строки. Сначала отбрасываем то, что выделенно красным. Потом смотрим в какой кодировке указана тема (UTF-8) Потом упакована ли строка (B - base64, для utf8 упаковка производится всегда) Дальше вырезаем строку и декодируем/транслируем в соотв. кодировку.

Dima: Петр Сделал так [pre2] if hb_RegexHas('[=]\?[A-Z0-9\-]+\?[A-Z]{1}+\?' ,oPop:getSubject(i) ) kk:=hb_regexSplit( '[=]\?[A-Z0-9\-]+\?[A-Z]{1}+\?', oPop:getSubject(i) , , ,1) а далее разбираю массив + на нужном элементе result:=hb_base64Decode( kk[JJ] ) тема всегда на English endif [/pre2]

Петр: По моему это можно упростить Материал по теме Если English, то charset можно игнорировать; декодировать нужно, только если encoding == "B"; от регулярных выражений можно отказаться, а можно и не отказываться

Dima: Петр Благодарю за подсказку !

Dima: Петр пишет: от регулярных выражений можно отказаться Верно , так даже проще [pre2] if hb_LeftEq(tema,'=?UTF-8?B?') .and. right(tema,2)=='?=' tema:=hb_base64Decode(substr(tema,11,len(tema)-12)) endif [/pre2]



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