2017-06-07 2 views
1

Ich versuche, alle meine ungelesenen E-Mails mit IMAP abzurufen, und ich scheint zu verbinden und diese ungelesene Nachricht zu lokalisieren (Ich kann zum Beispiel sehen, dass SearchResult 3 zurückgibt Elemente, die meinen 3 derzeit ungelesenen Nachrichten entsprechen), aber der IMAP.Retrieve-Aufruf gibt immer false zurück und ruft keine von ihnen ab.Ich kann nicht nur ungelesene Nachrichten mit TIdIMAP4 abrufen

Siehst du, was an meinem Code fehlen muss?

procedure TForm1.btnUnreadMessagesClick(Sender: TObject); 
var i: integer; 
    SearchInfo: array of TIdIMAP4SearchRec; 
    MSG: TIdMessage; 
begin 
    Memo1.Lines.Clear; 

    IMAP.Host := 'outlook.office365.com'; 
    IMAP.Port := 993; 
    IMAP.Username := '[email protected]'; 
    IMAP.Password := 'xxxxx'; 

    SSL.Host := IMAP.Host; 
    SSL.Port := IMAP.Port; 
    SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port); 
    SSL.MaxLineLength := MaxInt; 

    IMAP.IOHandler := SSL; 
    IMAP.UseTLS := utUseImplicitTLS; 

    IMAP.Connect; 
    IMAP.SelectMailBox('INBOX'); 

    SetLength(SearchInfo, 1); 
    SearchInfo[0].SearchKey := skUnseen; 
    IMAP.UIDSearchMailBox(SearchInfo); 

    for i := 0 to High(IMAP.MailBox.SearchResult) do begin 
    MSG := TIdMessage.Create(nil); 
    try 
     if IMAP.Retrieve(IMAP.MailBox.SearchResult[i], MSG) then begin 
     // Here is the problem, I never enter this section 
     Memo1.Lines.Add(MSG.From.Text); 
     end; 
    finally 
     MSG.Free; 
    end; 
    end; 
    IMAP.Disconnect; 
end; 

Danke für Ihre Hilfe.

+0

Danke Victoria für die Betrachtung. Es macht keinen Unterschied, ich habe SearchInfo [0] hinzugefügt. Datum: = Datum; und es findet die 3 ungelesenen Nachrichten (wie es bereits lokalisierte), aber wenn ich versuche, sie abzurufen, gibt IMAP.Retrieve (IMAP.MailBox.SearchResult [i], MSG) false zurück. :-( –

+2

Es sieht so aus, als ob Sie UIDs (aus Ihrer Suche) mit Sequence-Id-Calls mischen (ich kenne diese Bibliothek nicht, aber so sieht es aus.) Gibt es UID-Versionen von Retrieve? – Max

+1

@Max: your Analyse ist korrekt und ja, es gibt UID-basierte Retreival Funktionen zur Verfügung –

Antwort

3

Bei Verwendung von SearchMailBox() enthält das Array SearchResult Sequenznummern.

Bei Verwendung von UIDSearchMailBox() enthält das Array SearchResult UIDs.

Retrieve() erwartet eine Sequenznummer. Da Sie stattdessen UIDs haben, verwenden Sie UIDRetrieve(), z. B .:

IMAP.UIDRetrieve(IntToStr(IMAP.MailBox.SearchResult[i]), MSG) 
+0

Danke, jetzt verstehe ich es. –

Verwandte Themen