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




Пост 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 
ПрофильЦитата Ответить
модератор




Пост N: 1106
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 24.11.09 17:22. Заголовок: gustow пишет: Что д..


gustow пишет:

 цитата:
Что делаю не так?


Алексей!
Создайте все же графическое окошко, и уже из него вызывайте доставку/проверку почты.
У меня такое впечатление, что с помощью compile.bat Вы не получите консольное приложение под xHarbour

Что-нибудь типа...
Скрытый текст


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




Пост N: 1236
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.11.09 17:24. Заголовок: Наверное, не подключ..


Наверное, не подключается консольный терминал

В начале программы надо указать:

REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT

и проследить, чтобы прилинковывалась gtwin.lib

И еще, если не устраивает библиотека hbtip из Harbour, необязательно переходить на xHarbour
Можно создать гибрид, скрестив ужа с ежом, т.е. попробовать собрать tip из xharbour компилятором harbour.
Может и получится

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




Пост N: 1107
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 24.11.09 17:44. Заголовок: Pasha пишет: В нача..


Pasha пишет:

 цитата:
В начале программы надо указать:

REQUEST HB_GT_WIN
REQUEST HB_GT_WIN_DEFAULT


Спасибо!
Да, это решает проблему компиляции консольного приложения под xHarbour с помощью compile.bat

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




Пост N: 116
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 24.11.09 18:14. Заголовок: Отвечаю не по очеред..


Отвечаю не по очереди, извините (по мере "тырканья и пробования" :) ).

Pasha, прилинковал ( в компилирующую строку добавил "/l gtwin") и вписал REQUEST'ы.
Помогло! Экран синенький, "? ..." отображаются, на INKEY(0) реагирует.

И - самое главное - ВСЁ ОТРАБОТАЛО КАК НАДО !
Разгребло мэйлы, оставило в стороне те, которые без аттачей, а аттачи скинуло в указанную папочку (в CurDrive() + ":\" + CurDir() + "\tmp\" ).

А дальше уж "бизнес-логику" (куда перекидывать из "времянки", да надо ли [то ли, что надо, прислали?], да если дубли по именами [такой файл в "целевой" папке уже есть]...) - это уж, можно сказать, легко "как два пальца" распишу!.. Это уж ерунда!

Главное как раз в этом-то и было. (Кстати, тут :countMail() действительно правильно отрабатывает - возвращает "единственно верное" значение 3.)

Т.ч., Григорий, возьмите на заметку (авось, и другим пригодится) - вполне нормально получается консольное приложение и под xHarbour'ом! Причем с помощью вполне обычного, "родного минигуёвского" Compile.bat.

СПАСИБО, РЕБЯТА!

P.S. Примерчик оформлю завтра - запостю сюда, не возражаете? (да и в качестве сэмпла в "пакет" HMG Ext., думаю, пригодится - но этот вариант сделаю чуть попозже, чтоб красиво, "по правилам" всё оформить).

P.P.S. Куда антигриппозные маски высылать? :) :) :)


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


Пост N: 762
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.11.09 18:43. Заголовок: Все же вернемся к TI..


Все же вернемся к TIPClientPOP
К сожалению, он плохо спроектирован (в обеих своих вариантах) и его просто надо довести до ума.

Вот к примеру метод quit , Григорий - это не деструктор, а обычный метод который отправляет команду QUIT POP3 серверу со всеми вытекающими из этого последствиями.

Его использование в Harbour совсем не обязательно, этот пример будет работать корректно

oPopCli := IPClientPOP():New( "pop://user:pass@pop3.mail.ru")
IF !oPopCli:Open(); RETURN; ENDIF
? Left( oPopCli:List(), 10 )
//oPopCli:Stat()
//oPopCli:Quit()
oPopCli:Close()

если добавите перед :Close() вызов :Quit() - тоже будет все работать нормально.
Но! Если посмотреть реализацию метода Close, то увидим, что внутри этого метода ::Quit тоже вызывается ;(
А это уже вяжет программисту руки - команда QUIT переводит POP сервер из состояния TRANSACTION в состояние UPDATE. А значит все ошибочные изменения, допустим при использовании метода Delete, вступят в силу.
Значит нужно изворачиваться и вместо :Close() использовать напрямую hb_inetClose( oPopCli:SocketCon ) или переопределять свой метод.

Далее - обратите внимание, что возвращает ? Left( oPopCli:List(), 10 ) и вы поймете почему counMail() не может не возвращать то, что возвращает.
Сама реализация counMail() через команду LIST, а не STAT тоже вызывает, по меньшей мере, недоумение.

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




Пост N: 117
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 24.11.09 18:51. Заголовок: Спасибо, Петр, что о..


Спасибо, Петр, что обратили внимание на "кривизны" (или мне спасибо, что "поднял шум" вокруг этого функционала? :) ).

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

(часа 3 спустя)

И уж заодно - очередной "тупой" вопрос (просто не надо было такое раньше знать):
1) получаю список имеющихся писем;
2) выделяю из него "новые" (если есть);
3) иду по циклу "новых" (сперва беру от письма только :Top() - не все письмо);
4) если нет вложений - отвечаю посылателю (адрес знаю из :Top() ): мол, "ай-яй-яй" - и на п.3;
5) если есть вложения - иду в функцию (параметром передаю № письма из списка - nMail );
6) там гружу уже письмо целиком - через :Retrieve( nMail ) и :FromString( cTmp ) ( cTmp - Local в функции );
7) разбирая его ( oMail - тоже Local ), смотрю кол-во вложений;
8) если меньше пяти (надо иметь теперь 5 .XLS'ок) - соотв. "ай-яй-яй" и на п.3;
9) если есть среди вложений то, что надо - сохраняю вложения, посылаю "отлично!" и на п.3;

Так вот вопрос: коли и письмо, полученное в строку, и сформированный из строки oMail, и пр. будут в функции локальными - не будет ли накапливаться "мусор" в памяти (при большом кол-ве писем, обрабатываемых "за сеанс")? Надо ли принудительно "чистить" локальные перед выходом из функции (присваивая Nil), или память, отведенная под них, будет освобождаться "автоматом" при RETURN ? А то приложение должно крутиться в автоматическом режиме на сервере - и, естественно, желательно обойти подобные "подводные камни". Просто как-то не просвещался ранее в подобном...

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


Пост N: 763
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.11.09 00:18. Заголовок: Я так понял вы будет..


Я так понял вы будете использовать xHb - значит смотрите описание функций hb_gc*() (у вас к xBuild еще reference guide в придачу). В принципе GC (сборщик мусора) в xHb и Harbour отличаются и в последнее время очень. Я, чтобы потом не заморачиваться, при компиляции Harbour использую макро HB_GC_AUTO (читайте в Harbour ChangeLog, что это за зверь и зачем он нужен).

regustow пишет:

 цитата:
Надо ли принудительно "чистить" локальные перед выходом из функции (присваивая Nil), или память, отведенная под них, будет освобождаться "автоматом" при RETURN


Не надо или не обязательно, в общем как вам нравится. Сокеты не забывайте закрывать, файлы. В общем все как всегда, только аккуратненько так..
Да, TRY/CATCH, BEGIN SEQUENCE/END SEQUENCE - ваши надежные друзья-товарищи; переработанный errorsys в случае краха всегда должен быть готов отправить вам мыло или SMS; при возможности приставьте к вашей программе программу-сторожа, которая проверяла бы - жив ли процесс и в случае необходимости запускала бы его автоматически; помните, что ваша программа может управляться при помощи получаемых сообщений и т.д.



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




Пост N: 118
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 25.11.09 08:16. Заголовок: Петр, советы понял и..


Петр, советы понял и принял :)
Приложение будет запускаться на сервере (там же - на сервере - будет лежать и сама EXEшка, и "выгребенные" ею вложения из писем) Шедулером каждый час (или 2 - в общем, как у нас решат), "разгребать" и завершаться. Главное - чтобы если подвалит (вдруг) достаточно большое количество писем (в очередной "сеанс"), то чтобы в процессе "разгребания" не случилось ситуации "а у меня памяти больше нету :) ..." (надеюсь, что такого не случится - постараюсь "тщательнЕе" расписать).

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


Пост N: 764
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.11.09 00:01. Заголовок: Сбросил на SVN изме..


Сбросил на SVN изменения в класс TIPClientPOP

Основные изменения:
- полностью переписанный метод countMail() возвращает правильный результат, использует меньше памяти, создает меньше сетевого трафика, работает быстрее;
- добавлен метод Rset(). Если какие-то сообщения были помечены для удаления с помощью метода Delete(), то с них снимается метка удаления.
Всегда нужно помнить, что метод countMail() не учитывает сообщения, отмеченные для удаления (как и List())
- добавлен метод OpenDigest() - данный метод для авторизации на сервере использует команду APOP. В отличии от Open() (команды USER/PASS) где и имя и пароль пользователя отсылаются "как есть" в виде строки, OpenDigest() передает на pop3 сервер пароль пользователя зашифрованным в виде MD5 хеш-строки, что само по себе несколько увеличивает безопасность

Пример здесь
Скрытый текст


Тестировал на локальном почтовом сервере и с помощью сервиса mail.ru


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




Пост N: 120
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 29.11.09 22:42. Заголовок: Спасибо, Петр! Сам я..


Спасибо, Петр! Сам я пересобирать библиотеку для Harbour (текущего, что идет с HMG Ext.) не буду (пока) - пусть уж появится в "нормальном" виде (в очередной сборке Григория), тогда уж и перестану "изменять с xHarbour'ом" :) .

А как насчет "вылетов" по FromString() (в Harbour - есть, в xHarbour - нет)? Удалось (удастся) побороть? Не понукаю - просто вспомнил, что еще и это... А, наверное, есть и еще не обнаруженные (мною или кем-то) "глюки" в реализации для Harbour.

За метод шифрованной авторизации - отдельное спасибо! (думаю, многим понравится не "светиться" с паролями в открытом виде в трафике) Да и остальные добавления и изменения весьма полезны.

По моей работе - практически всё (под xHarbour в консоли) работает уже как надо (допричесываю "бизнес-логику": разбор самих вложений, что делать с "повторными" письмами и пр. - но это уже "фантики" :) ).

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


Пост N: 765
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.11.09 23:02. Заголовок: gustow пишет: А, на..


gustow пишет:

 цитата:
А, наверное, есть и еще не обнаруженные (мною или кем-то) "глюки" в реализации для Harbour.


Есть, конечно. По крайней мере я еще 2 нашел, но относятся они в равной мере к обеим реализациям.


 цитата:
А как насчет "вылетов" по FromString() (в Harbour - есть, в xHarbour - нет)?



Просто многие забывают, а некоторые, думаю, и не знают различий в реализации hb_aTokens в Harbour и xHb
Для начала попробуйте угадать, что выведет на консоль эта программа в Harbour/xHb

PROCEDURE main 
LOCAL aTokens := hb_aTokens( "1|2|3|", "|")

QOut( Len( aTokens ) )

RETURN

Я думаю дальше все становится очевидным..

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


Пост N: 766
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.11.09 23:17. Заголовок: ну и еще один пример..


ну и еще один пример для закрепления материала
PROCEDURE main 
LOCAL aTokens := hb_aTokens( "1|2|3|", "|2")

QOut( Len( aTokens ) )

RETURN


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




Пост N: 123
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 29.11.09 23:53. Заголовок: На 1-й пример гордо ..


На 1-й пример гордо :) и сходу отвечаю: в Harbour = 4, в xHb = 3 ( тот же countMail() - где поначалу сходу и "обмишурился").
Во 2-м: у xHb = 2, у Hb = тоже 2.

Мдааа... Не думал, что так все "запущено" :) :(
В общем, понятно, что для Harbour, скорее всего, изрядно "перелопачивать" реализацию придется...

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


Пост N: 767
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 30.11.09 00:31. Заголовок: Начну с последнего g..


gustow пишет:

 цитата:
Во 2-м: у xHb = 2, у Hb = тоже 2.


в xHb - 3
поскольку hb_aTokens в качестве 2-го параметра принимает только строку состоящую из одного символа или правильнее сказать использует в качестве разделителя первый символ передаваемой строки.
Для того чтобы получить результаты как в Harbour, нужно использовать функцию hb_aTokens2 (упоминания о ней не найдете ни changelog, ни в xHarbour Guide Reference ).

 цитата:
В общем, понятно, что для Harbour, скорее всего, изрядно "перелопачивать" реализацию придется...


Не думаю, всего лишь нужно учитывать особенность реализации одной функции и не более.
К слову сказать, я считаю результат возвращаемый Harbour более корректным и не я один, наверное, раз в xHb появилась hb_aTokens2

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




Пост N: 124
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 30.11.09 08:14. Заголовок: Петр пишет: в xHb -..


Петр пишет:

 цитата:
в xHb - 3

А, да, конечно - просто автоматом шлепнул 2.
Чем дальше в лес... :)

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




Пост N: 126
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 02.12.09 17:12. Заголовок: Еще "помощь зала..


Еще "помощь зала" понадобилась :)
В полях заголовка письма и в именах файлов аттачей встречаются строки в KOI8-R (бог с ней, с UTF8 - хоть бы с этим разобраться!)...
Что-то не соображу, как перекодировать, например, такую строку из поля заголовка письма "From" (адрес отправителя - "От")
=?koi8-r?Q?=E1=CC=C5=CB=D3=C5=CA_=E7=D5=D3=D4=CF=D7?= <gustow336@pochtamt.ru>
, чтобы в результате (в RU1251) иметь
Алексей Густов <gustow336@pochtamt.ru>

Аналогично и для аттачей: например, при разборе очередного аттача к письму, считанному в oMail, при GetFileName() получаю, например,
=?koi8-r?Q?Press=5Freliz=5F9=5F10=5F09g.doc?=
, а в результате надо иметь строку в RU1251:
Press_reliz_9_10_09g.doc

Извиняюсь, если раньше обсуждалось - что-то не нашел.

"oMail" создаю и заполняю как (к примеру)
 cTmp := oPop:Retrieve( 1 )   // читаем с POP-сервера письмо №1 
oMail := TIpMail():new()
oMail:FromString( cTmp )
cFrom := oTIpMail:getFieldPart( "From" )
// получаем строку с именем (необязательно) и адресом отправителя


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


Пост N: 774
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 09.12.09 00:36. Заголовок: Как то раньше на гла..


Как то раньше на глаза не попалось.. Наверное уже решили, но может кому то пригодится

Значит на входе у вас
=?koi8-r?Q?Press=5Freliz=5F9=5F10=5F09g.doc?=
Отбрасываете слева =?koi8-r?
Потом еще Q?
Отрезаете справа ?=
Далее в результате
oEncoder := TIPEncoderQP():New()
? oEncoder:Decode( "Press=5Freliz=5F9=5F10=5F09g.doc" )
получаете искомое
Press_reliz_9_10_09g.doc

Теперь
=?koi8-r?Q?=E1=CC=C5=CB=D3=C5=CA_=E7=D5=D3=D4=CF=D7?= <gustow336@pochtamt.ru>
Для начала вам необходимо выделить адрес
   nPos := At( "<", cFrom ) 
IF nPos > 0
nPos2 := hb_At( ">", cFrom, nPos + 1 )
IF nPos2 > nPos
cMailAdr := SubStr( cFrom, nPos, ( nPos2 - nPos ) + 1 )
ENDIF
cFrom := substr( cFrom, 1, nPos )
ENDIF

А потом уже декодирование строки с именем, т.е.
отбрасываем слева =?koi8-r?, потом еще Q?, отрезаем справа ?= и т.д.

Обратите внимание, что при использовании метода FromString объекта oMail объект oEncoder может создаваться автоматически -
это упрощает вашу задачу

oMail := TIpMail():new()
oMail:FromString( cTmp )
cFrom := oTIpMail:getFieldPart( "From" )
потом манипулируем с cFrom как было указано выше и в конце концов
? oMail:oEncoder:Decode( cFrom ) + cMailAdr
выведет вам
Алексей Густов <gustow336@pochtamt.ru>

gustow пишет:

 цитата:
как перекодировать, например,


hb_translate еще не отменяли
REQUEST HB_CODEPAGE_RU866
REQUEST HB_CODEPAGE_RUKOI8
hb_translate( "с╠┼╦╙┼╩ ч╒╙╘╧╫ <gustow336@pochtamt.ru>", "RUKOI8", "RU866" )

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




Пост N: 131
Зарегистрирован: 06.02.07
ссылка на сообщение  Отправлено: 09.12.09 14:17. Заголовок: Петр пишет: Наверно..


Петр пишет:

 цитата:
Наверное уже решили,


Да, в принципе (и почти что уже "в кожухе" :) - ["Прибор должен быть не в принципе, а в кожухе." (с) С.П. Королев]) решил.
Чуть "поплутал" с Hb_Translate() - но все же выплыл. :)

Кстати, вместо "простого" пути ("отбрасываете..." и т.д. по вышеуказанному) пришлось чуть усложнить процедуру раскодирования. При крэш-тестах на реальном массиве писем наткнулся на ситуации, когда строка (например, значение из "From") содержит не одну, а 2 или более подстрок, каждая из которых ограничена, к примеру, "=?koi8-r" и "?="... Ничего страшного - написал процедурку для разбора и с учетом таких ситуаций...

Причем встречаются - и довольно часто - ситуации, когда oEncoder не создается автоматически (ну нет в RFC-822 у этого письма строки "Content-Transfer-Encoding" !..) - и тогда берем CharSet и Encoding непосредственно из закодированной строки (там же нам есть - как в разбираемой моей строке в вашем посте - и "koi8-r" [cChar = "RUKOI8"], и "q" [Encoding = ""quoted-printable"]... сооружаем соответствующий энкодер [oEncoder := TIPEncoderBase64():New( ) или oEncoder := TIPEncoderQP():New( )], раскодируем [cData := oEncoder:Decode( cData )], потом транслэйтим [cData := Hb_Translate( cData, cChar, "RUWIN" ) или cData := Hb_Utf8ToStr( cData )]... и все нормально! (в cData - выделенная из ограничителей раскодируемая подстрока)

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

Главное - что сам процесс заработал вполне четко и контролируемо!..

P.S. Да!.. Еще выявился недостаток (недостаток ли?) метода oMail:DetachFile()... Если имя файла содержит не только латиницу, цифры или "-", "_" (и, соответственно, в результате :GetFileName() тоже предстает подобной кодированной строкой - см. начало DetachFile() в MAIL.PRG), то без дополнительного декодирования DetachFile() не срабатывает (возвращает .F. и FError() = 2; "File not found"), и, соответственно, вложение не сохраняется... Пока что решил это просто: скопировал DetachFile() как функцию к себе, добавил в ее вызов параметр cFileName (соответственно, "заглушив" внутренний ее LOCAL), и вызываю, указывая не только cPath, но и (уже раскодированный) cFileName... И все отлично срабатывает! М.б. как-то учесть такое в "родном" харборовском MAIL.PRG?

На днях (сейчас чуть запарка) выложу все же пример на основе кода для этой задачки. Надеюсь, кому поможет в подобной "автоматизации".

P.P.S. По "скоростным" характеристикам "крэш-теста": из 90 писем с вложениями (а это около 25% дневной нормы) "раскидывает" вложения по папочкам секунд за 40... По-моему, вполне прилично (человек - минимум минут за 30 "тупой" работы).

P.P.S. А как начнутся "кириллические" домены (надеюсь, не слишком скоро) - ооооопяяятттььь в куче мест (в т.ч. и для этих "почтовых" вещей) придется "учитывать специфику" :) всем нам...

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


Пост N: 776
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 09.12.09 22:33. Заголовок: gustow пишет: Кстат..


gustow пишет:

 цитата:
Кстати, вместо "простого" пути


Это не "простой" путь - это такой упрощенный типа алгоритм. Нормально-правильно использовать регулярные выражения для разбора строки - но извините, не хотелось много писать

 цитата:
когда oEncoder не создается автоматически


Имейте ввиду, что указать на нужный oEncoder мы можем создавая объект oMail с помощью метода New или с помощью метода setEncoder

 цитата:
в декодируемых строках вместо пробелов появляются "_"


Я заметил. Может быть это связано с несоответствием таблиц перекодировок в разных реализациях.

 цитата:
М.б. как-то учесть такое в "родном" харборовском MAIL.PRG?


М.б. К примеру метод GetBody это учитывает
METHOD GetBody() CLASS TipMail 
..
ELSEIF ::oEncoder != NIL
RETURN ::oEncoder:Decode( ::cBody )
..


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





Пост N: 318
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 29.02.16 19:18. Заголовок: Добрый вечер! Подск..


Добрый вечер!

Подскажите пожалуйста? Встала аналогичная задача... разобрав пример из инструкции и полазив по исходникам - она показалась несложной, но возник затык в самом начале:

В примере: Задан адрес "почты"

oPop := TIpClientPop():new( "pop://mailaccount:password@pop.server.com" )
IF .NOT. oPop:open()
? "Connection error:", oPop:lastErrorMessage()
QUIT
ELSE

aEMails := oPop:retrieveAll()
oPop:close()
ENDIF

У меня настройки почты:
Логин: Andrey@pricup.com
Пароль: ****
IMAP-сервер: imap.pricup.com
POP3-сервер: pop.pricup.com
SMTP-сервер: smtp.pricup.com

Пишу соответственно: oPop := TIpClientPop():new( "pop://Andrey@pricup.com:****@pop.pricup.com" ) - программа в ? "Connection error:", oPop:lastErrorMessage() диагностирует превышение timeout

Пытаюсь изменить время "допроса" сервера
oPop := TIpClientPop():new( "pop://Andrey@pricup.com:****@pop.pricup.com" )
oPop:nConnTimeout := 20000 - впрочем ставил разные значения - всё без разницы

Игрался с адресами, другими почтовыми ящиками, вызовами через класс:
cUrl := "pop://gripptest:gripptest@26.188.255.166"
oUrl := tURL():New( cUrl )
oClient := TIpClientPop():new( oUrl )

и т.д. никаких изменений не происходило. Прочитал кучу советов, но у "всех" этот нулевой этап доступа к почтовому ящику видимо спокойно проходил...

Что делаю неправильно или где копать?
Подскажите пожалуйста!



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




Пост N: 5494
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.02.16 19:44. Заголовок: AndreyZh Сделай лог..


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

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





Пост N: 319
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 29.02.16 20:40. Заголовок: Dima пишет: Сделай..


Dima пишет:

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



Дима спасибо! Но ничего не понял?

1.Сделай лог приема/отправки (есть опция)

Как и где?

2. и разбери его

Какой формат и как его увидеть?

3. возможно нужно включить SSL

Как? Хотя смотрел настройки "учетной записи" в Thunbird - там не включено

4. Как можно увеличить таймаут? Может просто не успеваю "достучаться"?

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




Пост N: 5495
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.02.16 22:29. Заголовок: AndreyZh пишет: 1.С..


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



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



Пост N: 175
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 29.02.16 22:31. Заголовок: Почта...


Не уверен, что выбранный метод..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 или нет , и т.д.
..
В примерах достаточно инфы, чтобы сделать свою почтовую службу





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




Пост N: 5496
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.03.16 00:02. Заголовок: petr707 пишет: Отпр..


petr707 пишет:

 цитата:
Отправлять письма можно:


Андрей хочет принимать мыло.

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





Пост N: 320
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 09:03. Заголовок: Dima пишет: Андрей ..


Dima пишет:

 цитата:
Андрей хочет принимать мыло.


Абсолютно верно... и как ТС для сохранения и обработки вложений

Сейчас продолжу эксперименты

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





Пост N: 321
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 11:11. Заголовок: Так и ничего не доби..


Так и ничего не добился!

Код:
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 - абсолютно аналогично

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




Пост N: 5497
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.03.16 11:20. Заголовок: файер не блочит ?..


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

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





Пост N: 322
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 12:17. Заголовок: Dima пишет: файер н..


Dima пишет:

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


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


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




Пост N: 5498
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.03.16 15:31. Заголовок: AndreyZh пишет: oPo..


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"


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





Пост N: 323
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 18:40. Заголовок: Dima пишет: вот так..


Dima пишет:

 цитата:
вот так надо в кавычках "pop://Andrey@pricup.com:****@pop.pricup.com"


Извините за молчание - работа в "поле"... Конечно ставил в кавычках, просто при копировании не отразил...

Вариантов решения общей "задачи" - сохранение вложение довольно много, например настройка почтового клиента на сохранение вложений... просто интересно было решить задачку в рамках средств xHarbour, тем более, что имеются такие "красивые" согласно документации средства. Ещё поизучаю опыт из интернета, но если не получится - не судьба

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




Пост N: 5500
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.03.16 19:04. Заголовок: AndreyZh пишет: про..


AndreyZh пишет:

 цитата:
просто интересно было решить задачку в рамках средств xHarbour


Так у тебя xHarbour все таки. А я тестил на Harbour

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


Пост N: 1187
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 01.03.16 19:31. Заголовок: AndreyZh, а доступ к..


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

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





Пост N: 324
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 21:45. Заголовок: Dima пишет: Так у т..


Dima пишет:

 цитата:
Так у тебя xHarbour все таки. А я тестил на Harbour


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

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





Пост N: 325
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 01.03.16 21:46. Заголовок: PSP пишет: AndreyZh..


PSP пишет:

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


Думаю, что доступа нет, но мне главное решение "в принципе", а почтовый ящик можно сделать на любом сервере - лишь бы работало!

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



Пост N: 176
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 01.03.16 22:21. Заголовок: А другим софтом - доступ к этому ящику есть ?


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

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




Пост N: 5501
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.03.16 22:26. Заголовок: Был похожий глюк на ..


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

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





Пост N: 326
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 02.03.16 11:00. Заголовок: petr707 пишет: Удае..


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 и посмотреть на нём

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





Пост N: 327
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 02.03.16 13:07. Заголовок: Разрешите для начала..


Разрешите для начала анекдот?


 цитата:
Еврей приходит к Раввину, и говорит:
- Ребе, помогите, куры дохнут!
Раввин подумал, порылся в Талмуде, и говорит:
- Попробуй их в морской воде искупать.
Еврей возвращается через неделю, и говорит:
- Ребе, всё равно куры дохнут!
Раввин подумал, порылся в Талмуде, и говорит:
- Попробуй их кормить свежей редькой.
Еврей возвращается через неделю, унылый, и говорит:
- Ребе, куры все сдохли!
Раввин почесал в затылке, и говорит:
- Жаль, а у меня ещё столько хороших идей было...



Установил сначала 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 <<


... В общем понял, что нужно искать более проработанный инструмент или терять время, когда его будет больше

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




Пост N: 5502
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.03.16 15:05. Заголовок: AndreyZh пишет: 201..


AndreyZh пишет:

 цитата:
20160302-12:25:58 :INETCONNECT( mail.ru, 110 )


До лампочки

AndreyZh пишет:

 цитата:
20160302-12:43:59 :INETCONNECT( yandex.ru, 110 )


И это тоже , так как на них обоих включена обязательная SSL ,
поэтому без HBSSL тут не обойтись.
Порт 110 так же не катит.


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





Пост N: 328
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 02.03.16 15:15. Заголовок: Извините за тон уваж..


Извините за тон уважаемые господа... и спасибо за посильную помощь!

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

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




Пост N: 6259
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.01.17 19:07. Заголовок: AndreyZh пишет: oUr..


AndreyZh пишет:

 цитата:
oUrl := tURL():New( "pop://poseydon2000solprod@yandex.ru:****@pop.yandex.ru" )


тут нужен pop3s

Тоже стал разбираться со чтением почты , чекал на mail.ru
Не знаю как на яше но на майл ру логин нужно передавать без @mail.ru

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




Пост N: 6268
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.01.17 15:05. Заголовок: Непонятная порча с ч..


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

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




Пост N: 6269
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.01.17 15:29. Заголовок: OnLine декодер распо..


OnLine декодер распознал однако

Как теперь в Harbour раскодировать ?

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




Пост N: 6270
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.01.17 16:21. Заголовок: Вроде понял как Нужн..


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

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


Пост N: 1408
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.01.17 21:38. Заголовок: Dima пишет: =?UTF-8..


Dima пишет:

 цитата:
=?UTF-8?B?
Если такая строка есть , то вырезаем ее и после остатку строки делаем hb_base64Decode



Не совсем так.

=?UTF-8?B?KlNPUyM=?=

В этой теме был разбор похожей строки.
Сначала отбрасываем то, что выделенно красным. Потом смотрим в какой кодировке указана тема (UTF-8)
Потом упакована ли строка (B - base64, для utf8 упаковка производится всегда)

Дальше вырезаем строку и декодируем/транслируем в соотв. кодировку.


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




Пост N: 6271
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.01.17 22:16. Заголовок: Петр Сделал так ..


Петр
Сделал так
 
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


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


Пост N: 1409
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.01.17 22:45. Заголовок: По моему это можно у..


По моему это можно упростить

Материал по теме

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




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




Пост N: 6272
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 31.01.17 23:37. Заголовок: Петр Благодарю за п..


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

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




Пост N: 6273
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.02.17 10:00. Заголовок: Петр пишет: от регу..


Петр пишет:

 цитата:
от регулярных выражений можно отказаться


Верно , так даже проще
 
if hb_LeftEq(tema,'=?UTF-8?B?') .and. right(tema,2)=='?='
tema:=hb_base64Decode(substr(tema,11,len(tema)-12))
endif



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

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