Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IDPOP3 проблема чтения писем


barbaroska ©   (2008-12-06 22:00:00) 

Пробую:

procedure TForm1.checkMail;
var
 i, mailcount: DWord;
 popMessage: TIdMessage;

 procedure exit_;
 begin
   popMessage.Free;
   if IdPOP.Connected then IdPOP.Disconnect;
 end;

begin
ShowMessage('1111');
 popMessage:= TIdMessage.Create(form1);
 try
   IdPOP.Connect;
   mailcount:= IdPOP.CheckMessages;
   for i := 0 to mailcount - 1 do begin
      if IdPOP.Retrieve(i, popMessage) then begin // Принимаем письмо
         ShowMessage(popMessage.Subject+'='+popMessage.Body.Text);
         IdPOP.Delete(i);
      end;
   end;
   IdPOP.Disconnect; exit_;
 except
   exit_;
 end;
end;

коннект происходит, показывает что есть письма на сервере, но
IdPOP.Retrieve(i, popMessage)
возвращает ложь..

гугл ничего не дал...
что может быть?


Anatoly Podgoretsky   (2008-12-07 10:52:00) [1]

> bbk  (07.12.2008 0:59:06)  [6]

> такое ощущение, что MsgNum что-то другое, а не порядковый номер в колличестве писем на сервере.

А у тебя разуе номер письма, я лично вижу индекс.


Германн   (2008-12-07 01:24:00) [2]


> bbk   (07.12.08 00:59) [6]
>
> "Пройди вот этот тест"  какой тест?
>
>

Пардон. Не вставил ссылку.
http://www.delphikingdom.com/quintana/quintana.asp?ItemID=10


bbk   (2008-12-07 01:21:00) [3]

POP3-RETR ( n -- a u ior ) - принимает число (номер письма) в качестве аргумента и возвращает строку с полным текстом письма, которое хранится на сервере под указанным номером, а также номер возможной ошибки ввода/вывода

Вот пример простого сеанса с POP3 сервером:
S: <создаём новое TCP соединение c POP3 сервером через порт 110>
S: +OK POP3 server ready
C: USER MonstrVB
S: +OK User MonstrVB is exists
C: PASS mymail
S: +OK MonsrVB's maildrop has 2 messages (320 octets)
C: STAT
S: +OK 2 320
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
C: RETR 1
S: +OK 120 octets
S:
S: .
C: DELE 1
S: +OK message 1 deleted
C: RETR 2
S: +OK 200 octets
S:
S: .
C: DELE 2
S: +OK message 2 deleted
C: QUIT
S: +OK dewey POP3 server signing off (maildrop empty)
C: <закрываем соединение>

из этого я так понимаю что нумерация с 1 все таки, и нумерация соответсвует пока не закрыт протокол.

правильно?


bbk   (2008-12-07 01:10:00) [4]

вот что интересно, возвращает два письма.
при попытке прочитать IdPOP.Retrieve(0, popMessage) вовзращает ложь
при IdPOP.Retrieve(1, popMessage) читает
и при IdPOP.Retrieve(2, popMessage) читает

может нумерация там с 1 ? тогда что такое 0 (MsgNum) при котором читало..


bbk   (2008-12-07 00:59:00) [5]

"Пройди вот этот тест"  какой тест?

что-то я ничего не пойму с этим IdPOP.Retrieve

опять ничего не работает (:
возвращает что есть два письма, но ни IdPOP.Retrieve(0, popMessage) ни IdPOP.Retrieve(i, popMessage) не читает, возвращает ложь.
до этого все читалось, некоторые пробывал удалять..

function TIdPOP3.Retrieve(const MsgNum: Integer; AMsg: TIdMessage): Boolean;

такое ощущение, что MsgNum что-то другое, а не порядковый номер в колличестве писем на сервере.

погуглил опять безрезультатно..


Германн   (2008-12-07 00:33:00) [6]


> bbk   (06.12.08 23:00) [4]
>
> да нет, на сервере одно письмо и было.
> я просто поменял i с DWord на Integer

Ничего себе просто!
Пройди вот этот тест. И обрати внимание на вопрос №8.


bbk   (2008-12-06 23:00:00) [7]

да нет, на сервере одно письмо и было.
я просто поменял i с DWord на Integer как описано в Retrieve.

а вот насчет  IdPOP.Delete(i)  я кстати первым делом и подумал, но в найденом в нете примере так и было реализовано, пока не мог проверить из-за того что вообще прочитать не мог.

вероятно лучше сдель:

while idPOP.CheckMessages > 0 do begin
     if IdPOP.Retrieve(i, popMessage) then begin // Принимаем письмо
        ShowMessage(popMessage.Subject+'='+popMessage.Body.Text);
        IdPOP.Delete(0);
     end;
end;


Johnnnn   (2008-12-06 22:51:00) [8]

Да там просто все после того как ты удаляеш письмо то следующему по списку присваивается его номер тоесть было 0 и 1 одно ты удалил и оставшемуся присвоился номер 0 а твой цикл спрашивает про 1 а такого нет уже ну вообщем както так. может и не так незнаю точно


bbk   (2008-12-06 22:44:00) [9]

Johnnnn, спасибо!

действительно:

i, mailcount: Integer;

заработало,

странно очень...


Johnnnn   (2008-12-06 22:18:00) [10]

Так непомню что к чему но попробуй в етом кучке I на 0 поменять
IdPOP.Retrieve(0, popMessage) или на 1 может выйжет че


Наверх

Титульная страница Поиск, карта сайта Написать письмо