Jak sprawdzic ID e-maila bez pobierania go

0

Witam. Muszę zrobić coś, żeby sprawdzić ID wszystkich wiadomości na serwerze pop3. Używam indy10. Czy da się pobrać samą listę wiadomości (temat, adresata i id), bez pobierania całej wiadomości?

0

Tak. Pobieraj same nagłówki, czyli ReceiveHeader.

0

Do pobierania nagłówków służy bodajże polecenie HEADER, czy jakoś tak. W parametrze podajesz ile lini e-maila chcesz ściągnąć dodatkowo (oprócz nagłówków), więc jeśli nie chcesz nic, to walisz HEADER 0. Albo coś w tym stylu w każdym razie.

//Dopisane:
Ech, polecenie HEADER jest zdaje się poleceniem samego POP3, nie koniecznie musi występować w IdPop3.
Natomiast jak chodzi o szybkość sprawdzania: Przy stosunkowo małej wielkości listu (w sumie dotyczy to prawie każdego listu bez binarnego załącznika) najdłużej zajmuje sam proces łączenia z serwerem i wysyłania zapytania. Różnica między przesłaniem samego nagłówka a całej wiadomości jest znikoma.

0

Zrobiłem tak, ale chyba źle, bo sprawdzanie trwa nadal długo. Eee - nie mam takiego polecenia jak header. Przynajmniej nie w IdPop3, a jeśli to nie tam, to nie wiem gdzie mam go użyć. Oto jak to wcześniej zrobiłem:

procedure TRead.Execute;
var
 i: integer;
 msg : TIdMessage;
begin
 msg := TIdMessage.Create;
 Form1.IdPOP31.Connect;
 Form1.ListBox1.Items.Clear;
 for i := 1 to Form1.IdPOP31.CheckMessages do
 begin
  Form1.IdPOP31.RetrieveHeader(i,msg);
  Form1.ListBox1.Items.Add(Form1.IdMessage1.MsgId+' : '+Form1.IdMessage1.Subject);
 end;
end;
0

Jest takie polecenie, ale Adam nie doczytał twojego posta i wskazał na polecenie nie komponentu IdPOP3, tylko bezpośrednio porotokołu. Twój kod pobierania nagłówków jest dobry. To, że długo trwa, to niestety wina łącza.

0

Ale na pewno da się to jakoś zrobić. Opera doskonale sobie z tym radzi. Mam na koncie 170 e-maili, a Opera szybko sprawdza i pobiera nowe wiadomości. Nie ma na to jakiegos innego sposobu?

//Zmieniłem trochę ten kod i mam pomysł jak pobierać tylko nowe e-maile. Tak wygląda kod:

procedure TRead.Execute;
var
 i : integer;
begin
 Form1.ListBox1.Clear;
 Form1.IdPOP31.Connect;
 Form1.IdPOP31.KeepAlive;
 Form1.ListBox1.Items.Add('E-Maile zajmują '+inttostr(Form1.IdPOP31.RetrieveMailBoxSize)+'b');
 for i := 1 to Form1.IdPOP31.CheckMessages do
 begin
  Form1.IdPOP31.RetrieveHeader(Form1.IdPOP31.CheckMessages-i+1, Form1.IdMessage1);
  Form1.ListBox1.Items.Add(Form1.IdMessage1.MsgId);
  Form1.ProgressBar1.Position := (i*500)div Form1.IdPOP31.CheckMessages;
  Form1.Label1.Caption := IntToStr((i*100)div Form1.IdPOP31.CheckMessages)+'%';
 end;

 Form1.IdPOP31.Disconnect;
end;

I jeśli w ten sposób zawsze będę pobierał wiadomości od najnowszej, do najstarszej, to mogę pobierać wiadomości, dopóki nie trafię na taką, jakiej id mam na jakiejś liście. Nowe ID byłyby dodawane do tej listy. Dzięki temu pobierałbym e-maile, dopóki nie trafiłbym na stary. Ale nie jestem pewny, czy to będzie się sprawdzać. Napiszcie, co o tym myślicie. I jeśli znacie jakieś inne rozwiązanie, to je podajcie :)

0

Tak na moje oko, to możesz zrobić pętlę

for i:= Form1.IdPOP31.CheckMessages downto 1
0

No można i tak :)

W parametrze podajesz ile lini e-maila chcesz ściągnąć dodatkowo (oprócz nagłówków),
Może tu jest problem. E-Maile z załącznikami pobierają się dłużej, więc pewnie pobiera się cały e-mail, a nie tylko nagłówki. Jak to ustawić??

0

Nie wiem czy to coś da, ale spróbuj tylko raz użyć funkcji Form1.IdPOP31.CheckMessages, bo może za każdym razem jak ją wykonujesz to się łączy i spowalnia, czyli najpierw przypisz ilość wiadomości do zmiennej, a później używasz zmiennej zamiast funkcji...

Będzie to mniej więcej tak:

procedure TRead.Execute;
var
 i, j : integer;
begin
 Form1.ListBox1.Clear;
 Form1.IdPOP31.Connect;
 Form1.IdPOP31.KeepAlive;
 Form1.ListBox1.Items.Add('E-Maile zajmują '+inttostr(Form1.IdPOP31.RetrieveMailBoxSize)+'b');

 j=Form1.IdPOP31.CheckMessages;

 for i := 1 to j do
 begin
  Form1.IdPOP31.RetrieveHeader(j-i+1, Form1.IdMessage1);
  Form1.ListBox1.Items.Add(Form1.IdMessage1.MsgId);
  Form1.ProgressBar1.Position := (i*500)div j;
  Form1.Label1.Caption := IntToStr((i*100)div j)+'%';
 end;

 Form1.IdPOP31.Disconnect;
end;
0

To nie pomaga :(. Dam może nowy kod. Może ktoś coś poprawi / doda / zmieni

[...] 

type 
 [...] 

  TLoadEMails = class(TThread) 
   protected 
    procedure Execute; override; 
  end; 

var 
  [...] 
  I, Count : Integer; 

[...] 

//Procedura pobierania nagłówków 
procedure TLoadEMails.Execute; 
begin 
 if Form1.IdPOP31.Connected then 
  Form1.IdPOP31.Disconnect; 
 Form1.IdPOP31.Host     := Form1.Edit1.Text; 
 Form1.IdPOP31.Username := Form1.Edit2.Text; 
 Form1.IdPOP31.Password := Form1.Edit3.Text; 
 Form1.ListBox1.Items.Clear; 
try 
 Form1.IdPOP31.Connect; 
 Form1.Label4.Caption := 'Connected'; 
 Count := Form1.IdPOP31.CheckMessages; 
 for i := Count downto 1 do 
 begin 
  Form1.IdMessage1.Clear; 
  Form1.IdPOP31.RetrieveHeader(i, Form1.IdMessage1); 
  Form1.ListBox1.Items.Add(Form1.IdMessage1.MsgId); 
  Form1.ProgressBar1.Position := ((Count-i)*100)div Count; 
 end; 
except 
 Form1.ListBox1.Items.Add('Error!'); 
end; 
Form1.IdPOP31.Disconnect; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
 LoadEMails : TLoadEMails; 
begin 
 if IdPOP31.Connected then 
  Exit; 
 LoadEMails := TLoadEMails.Create(false); 
 LoadEMails.FreeOnTerminate := True; 
end; 

procedure TForm1.IdPOP31Disconnected(Sender: TObject); 
begin 
 Label4.Caption := 'Disconnected'; 
 ProgressBar1.Position := 100; 
end; 

end. 

1 użytkowników online, w tym zalogowanych: 0, gości: 1