Я не могу получить только непрочитанные сообщения, используя TIdIMAP4

Я пытаюсь получить все свои непрочитанные сообщения электронной почты, используя IMAP, и мне кажется, что я подключаюсь и точно нахожу эти непрочитанные сообщения (например, я вижу, что SearchResult возвращает 3 элемента, соответствующих моим 3 непрочитанным в настоящее время сообщениям), но IMAP.Retrieve call всегда возвращает false, не получая ни одного из них.

Вы видите, чего не хватает в моем коде?

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 := 'xxxxx@acme.com';
  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;

Спасибо за вашу помощь.

1 ответ

Решение

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

Когда используешь UIDSearchMailBox(), SearchResult массив содержит UID.

Retrieve() ожидает порядковый номер. Поскольку вместо этого у вас есть UID, используйте UIDRetrieve()Например:

IMAP.UIDRetrieve(IntToStr(IMAP.MailBox.SearchResult[i]), MSG)
Другие вопросы по тегам