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

Dima: AndreyZh Сделай лог приема/отправки (есть опция) и разбери его , возможно нужно включить SSL

AndreyZh: Dima пишет: Сделай лог приема/отправки (есть опция) и разбери его , возможно нужно включить SSL Дима спасибо! Но ничего не понял? 1.Сделай лог приема/отправки (есть опция) Как и где? 2. и разбери его Какой формат и как его увидеть? 3. возможно нужно включить SSL Как? Хотя смотрел настройки "учетной записи" в Thunbird - там не включено 4. Как можно увеличить таймаут? Может просто не успеваю "достучаться"?

Dima: AndreyZh пишет: 1.Сделай лог приема/отправки (есть опция) Как и где? AndreyZh пишет: oPop := TIpClientPop():new( "pop://Andrey@pricup.com:****@pop.pricup.com" ) TIpClientPop():new( "pop://Andrey@pricup.com:****@pop.pricup.com", .T.) // видимо так , смотри сырец по умолчанию на POP , порт 110


petr707: Не уверен, что выбранный метод..TIpClientPop - лучшее решение можно попробовать hb_sendmail или TIpClientSmtp Что такое лог ? Во всех методах есть параметр - включить создание лог файла при ltrace=.t. создается лог - файл с именем SMTP-nnn.log где nnn - порядковый номер сеанса // preparing SMTP object oSmtp := TIpClientSmtp():new( cSmtpUrl, ltrace ) ... так выглядит лог-файл 20150801-19:53:55 :INETCONNECT( me.myserver.ru.com, 25 ) >> <pointer> << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << 20150801-19:53:55 :INETRECVLINE( <pointer>, , 512 ) >> 220 post.myserver.ru.com Microsoft ESMTP MAIL Service ready at Sat, 1 Aug 2015 19:53:52 +0300 << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << 20150801-19:53:55 :INETSENDALL( <pointer>, 9, HELO ОТПРАВИТЕЛЬ<cr><lf> ) >> 9 << 20150801-19:53:55 :INETRECVLINE( <pointer>, , 512 ) >> 250 post.myserver.ru.com Hello [83.167.104.184] << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << 20150801-19:53:55 :INETSENDALL( <pointer>, 28, MAIL FROM: <me@myserver.com><cr><lf> ) >> 28 << 20150801-19:53:55 :INETRECVLINE( <pointer>, , 512 ) >> 250 2.1.0 Sender OK << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << 20150801-19:53:55 :INETSENDALL( <pointer>, 25, RCPT TO: <who@me.myserver.com><cr><lf> ) >> 25 << 20150801-19:53:55 :INETRECVLINE( <pointer>, , 512 ) >> 250 2.1.5 Recipient OK << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << 20150801-19:53:55 :INETSENDALL( <pointer>, 6, DATA<cr><lf> ) >> 6 << 20150801-19:53:55 :INETRECVLINE( <pointer>, , 512 ) >> 354 Start mail input; end with <CRLF>.<CRLF> << 20150801-19:53:55 :INETERRORCODE( <pointer> ) >> 0 << .... 2) Нужно понять или настроить - какого типа авторизацию просит почтовый сервер, через который Вы пробуете работать. Отправлять письма можно: 1) через свой собственный сервер - все настройки полностью Ваши 2) публичный или корпоративный - надо соблюдать правила чужого сервера. Это номера портов, SSL или нет , и т.д. .. В примерах достаточно инфы, чтобы сделать свою почтовую службу

Dima: petr707 пишет: Отправлять письма можно: Андрей хочет принимать мыло.

AndreyZh: Dima пишет: Андрей хочет принимать мыло. Абсолютно верно... и как ТС для сохранения и обработки вложений Сейчас продолжу эксперименты

AndreyZh: Так и ничего не добился! Код: cUrl := pop://Andrey@pricup.com:****@pop.pricup.com oUrl := tURL():New( cUrl ) oPop := TIpClientPop():new( oUrl, .F. ) // .T. Трассировка соединения oPop:nDefaultPort := 110 oPop:nConnTimeout := 500000 IF !oPop:open() Возвращает .F. и по факту таймаут не меняется... Файлы трассировки при включении пустые... Непонятно!!! Во всех интернетовских примерах и обсуждениях это беспроблемно работающий код? Ping по адресу: pop.pricup.com проходят, пытался заменять на прямой адрес 89.111.176.249 - абсолютно аналогично

Dima: файер не блочит ?

AndreyZh: Dima пишет: файер не блочит ? Нет всё что можно отключил - те же история... Не понятно и до меня тяжело доходит, когда нет ни сообщений, ни диагностик, а лишь "срединение не доступно"... ещё конечно полазию по интернету, м.б. какие ещё нюансы нарою?

Dima: AndreyZh пишет: oPop := TIpClientPop():new( "pop://Andrey@pricup.com:****@pop.pricup.com" ) oPop:nConnTimeout := 20000 - впрочем ставил разные значения - всё без разницы Пробнул у себя с mail.ru , лог ведется , но он меня тормознул месагой "-ERR POP3 is available only with SSL or TLS connection enabled" в логе oPop:nConnTimeout ставил 2000 AndreyZh пишет: cUrl := pop://Andrey@pricup.com:****@pop.pricup.com вот так надо в кавычках "pop://Andrey@pricup.com:****@pop.pricup.com"

AndreyZh: Dima пишет: вот так надо в кавычках "pop://Andrey@pricup.com:****@pop.pricup.com" Извините за молчание - работа в "поле"... Конечно ставил в кавычках, просто при копировании не отразил... Вариантов решения общей "задачи" - сохранение вложение довольно много, например настройка почтового клиента на сохранение вложений... просто интересно было решить задачку в рамках средств xHarbour, тем более, что имеются такие "красивые" согласно документации средства. Ещё поизучаю опыт из интернета, но если не получится - не судьба

Dima: AndreyZh пишет: просто интересно было решить задачку в рамках средств xHarbour Так у тебя xHarbour все таки. А я тестил на Harbour

PSP: AndreyZh, а доступ к логам почтового сервера pop.picup.com есть? Может там что-то интересное найдётся?

AndreyZh: Dima пишет: Так у тебя xHarbour все таки. А я тестил на Harbour Извини, что не указал... просто стартовая тема была тоже под xHarbour и кажется тоже эксперименты безрезультатны. Для данной задачи мне по барабану - может быть и Harbour, т.к. это небольшая изолированная от других моих проектов задача, а по структуре баз всё идентично

AndreyZh: PSP пишет: AndreyZh, а доступ к логам почтового сервера pop.picup.com есть? Может там что-то интересное найдётся? Думаю, что доступа нет, но мне главное решение "в принципе", а почтовый ящик можно сделать на любом сервере - лишь бы работало!

petr707: Удается ли прочитать письма этого почтового ящика стандартным почтовым клиентом , Outlook' ом , например ? В этом клиенте - есть же настройки портов и прочее..

Dima: Был похожий глюк на Harbour 1.x http://clipper.borda.ru/?1-4-0-00000508-000-10001-0-1337333829 Не берусь судить о Xharbour так как не использую более. Пробни все таки свой примерчик собрать на последнем более менее свежем Harbour. Пробовал твой же пример из 7 строчек , все путем.

AndreyZh: petr707 пишет: Удается ли прочитать письма этого почтового ящика стандартным почтовым клиентом , Outlook' ом , например ? В этом клиенте - есть же настройки портов и прочее.. Всё настраивал и работаю с Thunderbird и понятно, что спокойно вхожу через броузер Dima пишет: Был похожий глюк на Harbour 1.x http://clipper.borda.ru/?1-4-0-00000508-000-10001-0-1337333829 Не берусь судить о Xharbour так как не использую более. Пробни все таки свой примерчик собрать на последнем более менее свежем Harbour. Пробовал твой же пример из 7 строчек , все путем Есть такой глюк с mail.ru, но через другие почтовые сервера отправка писем из прог на xHarbour при помощи Hb_sendmail не вызывает проблем Сейчас, в перерывах "между" попробую поставить Harbour и посмотреть на нём

AndreyZh: Разрешите для начала анекдот? Еврей приходит к Раввину, и говорит: - Ребе, помогите, куры дохнут! Раввин подумал, порылся в Талмуде, и говорит: - Попробуй их в морской воде искупать. Еврей возвращается через неделю, и говорит: - Ребе, всё равно куры дохнут! Раввин подумал, порылся в Талмуде, и говорит: - Попробуй их кормить свежей редькой. Еврей возвращается через неделю, унылый, и говорит: - Ребе, куры все сдохли! Раввин почесал в затылке, и говорит: - Жаль, а у меня ещё столько хороших идей было... Установил сначала Harbour на другом ПК, где когда-то трахался с ним сейчас в работе... и конечно кучка проблем со сборками программ - одна из причин почему использую xHarbour: меньше плясок с бубнами... конечно с ходу не получилось, тем более, что дергают. Тогда просто скопировал MiniGui, где так же есть свежий Harbour - более простое решение ради двух строк кода... Затем по "советам" начал перебирать свои почтовые ящики и пробовать передачу параметра в TIpClientPop по символьной переменной или объекту, например: oUrl := tURL():New( "pop://poseydon2000solprod@yandex.ru:****@pop.yandex.ru" ) oPop := TIpClientPop():new( oUrl, .T. ) ..... Короче, как не меняй эффект один, только Harbour хотя бы идентичные логи лепит, хотя и таймаут реально не изменяет, например: 20160302-12:18:49 :INETCONNECT( pricup.com, 110 ) >> <pointer> << 20160302-12:18:49 :INETERRORCODE( <pointer> ) >> 17 << 20160302-12:25:58 :INETCONNECT( mail.ru, 110 ) >> <pointer> << 20160302-12:25:58 :INETERRORCODE( <pointer> ) >> 17 << 20160302-12:43:59 :INETCONNECT( yandex.ru, 110 ) >> <pointer> << 20160302-12:43:59 :INETERRORCODE( <pointer> ) >> 17 << ... В общем понял, что нужно искать более проработанный инструмент или терять время, когда его будет больше

Dima: AndreyZh пишет: 20160302-12:25:58 :INETCONNECT( mail.ru, 110 ) До лампочки AndreyZh пишет: 20160302-12:43:59 :INETCONNECT( yandex.ru, 110 ) И это тоже , так как на них обоих включена обязательная SSL , поэтому без HBSSL тут не обойтись. Порт 110 так же не катит.



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