Jak odczytać ilość nowych maili z IMAP?

0

Witajcie,

Utknąłem ... i potrzebuję waszej pomocy. Potrzebuję zalogować się na pocztę na gmail.com przy użyciu protokołu IMAP. Niestety z niewiadomych przyczyn indy mi rzuca dziwne błędy więc postanowiłem się przełamać i użyć synapse. 30 sekund pracy 10 sekund googlowania i mam gotowy mechanizm, który bez problemu łączy się do konta.

procedure TForm1.ConnectClick(Sender: TObject);
begin
  IMAP := TIMAPSend.Create;
  try
    IMAP.TargetHost := 'imap.gmail.com';
    IMAP.TargetPort := '993';
    IMAP.UserName := edLogin.Text;
    IMAP.Password := edPass.Text;
    IMAP.FullSSL := True;
    if IMAP.Login then
    begin
      MessageDlg('Super udało się', mtInformation, [mbOK], 0);
      IMAP.NoOp;
      IMAP.SelectFolder('INBOX');
    end
    else
      MessageDlg('I znowu porażka!', mtWarning, [mbOK], 0);
  finally
    IMAP.Free;
  end;
end;

Do pełni szczęścia potrzebuję jeszcze sprawdzić czy na danym koncie są jakieś nowe/nieprzeczytane wiadomości oraz ile ich jest. Napisałem nowe/nieprzeczytane gdyż na tym konkretnym koncie do którego potrzebuję ten skrypt nowe = nieprzeczytane więc jest mi wszystko jedno. Pytałem wujka google i 99% odpowiedzi było w stylu pobierz całość i porównuj listę z nowym pobraniem itd ...

Fajnie i takie rozwiązanie można zastosować dla POP3 ale wyczytałem również, że IMAP potrafi się "porozumieć" z klientem i zwrócić informacje o liczbie nowych wiadomości.

http://tools.ietf.org/html/rfc3501#section-7.3.1

Niestety nie bardzo wiem jak zmusić synapse do "gadania" z serwerem. Możecie coś podpowiedzieć?

3
procedure TForm1.ConnectClick(Sender: TObject);
var  
  ListaMsg, Msg: TStringlist;
  i: Integer;
begin
  IMAP := TIMAPSend.Create;
  try
    IMAP.TargetHost := 'imap.gmail.com';
    IMAP.TargetPort := '993';
    IMAP.UserName := edLogin.Text;
    IMAP.Password := edPass.Text;
    IMAP.FullSSL := True;
    if IMAP.Login then
    begin
      MessageDlg('Super udało się', mtInformation, [mbOK], 0);
      IMAP.NoOp;
      IMAP.SelectFolder('INBOX');
      ListaMsg:=TStringlist.Create;
      Msg:=TStringList.Create;
      if IMAP.SearchMess('UNSEEN', ListaMsg) then  //wyszukaj wszystkie nowe wiadomości i zapisz ich id do ListaMsg
      begin
        for i:=0 to ListaMsg.Count-1 do  //przeleć listę nowych wiadomości
        begin
          Msg.Clear;
          IMAP.FetchMess(StrToInt(ListaMsg[i]), Msg);  //pobierz całą wiadomość po jej id
          //IMAP.FetchHeader(StrToInt(ListaMsg[i]), Msg);  //w ten sposób możesz pobrać tylko nagłówek i z niego wyciągnąć tytuł, datę i nadawcę
          Msg.SaveToFile('C:\'+ListaMsg[i]+'.eml'); //i zapisz do pliku
        end;
      end; 
      ListaMsg.Free;
      Msg.Free;
    end
    else
      MessageDlg('I znowu porażka!', mtWarning, [mbOK], 0);
  finally
    IMAP.Free;
  end;
end;
0

Dzięki Paweł Dmitruk dokładnie tego UNSEEN potrzebowałem

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