Проверяйте непрочитанные сообщения с помощью Indy

Я просто ради забавы делаю приложение для проверки непрочитанных сообщений в Delphi. Я использую Indy 10. Я могу подключиться к Gmail и получить все сообщения, но я столкнулся с проблемой: я не могу сказать, прочитано сообщение уже или нет. В компоненте TidMessage есть свойство flag, которое должно сообщать мне, прочитано ли сообщение. Код выглядит так:

procedure TForm1.btTestConnectionClick(Sender: TObject);
var
 i: Integer;
 count: Integer;
 flag: TIdMessageFlags;
begin
 if (pop3Test.Connected) then begin
  pop3Test.Disconnect;
 end;

 pop3Test.Username := edAccount.Text;
 pop3Test.Password := edPassword.Text;
 pop3Test.Host := HOST;
 pop3Test.AuthType := patUserPass;
 pop3Test.Port := PORT;
 pop3Test.Connect;
 Count := 0;
 for i := pop3Test.CheckMessages downto 1 do begin
      pop3Test.Retrieve(i, IdMessage1);
      if (mfSeen in IdMessage1.Flags) then begin
       Count := Count + 1;
      end;
 end;


 ShowMessage(IntToStr(Count));
 pop3Test.Disconnect;
end;

В тестовом почтовом ящике есть одно непрочитанное сообщение, но для всех извлеченных сообщений свойство flags enum пусто, поэтому результат всегда равен 0. Я что-то делаю не так? Это проблема совместимости Indy / Gmail?

Спасибо.

РЕДАКТИРОВАТЬ: Я определенно делаю что-то не так, поскольку тестирование с учетной записью Hotmail показывает ту же проблему с пустыми флагами.


person Averroes    schedule 29.12.2010    source источник


Ответы (2)


протокол POP3 не поддерживает Message state information на сервере такие функции, как чтение, ответ или удаление. попробуйте вместо этого использовать IMAP for Gmail.

person RRUZ    schedule 29.12.2010

Лучший (и самый быстрый) способ найти этот ответ - поискать в исходном коде Indy слово «mfSeen». Вы должны найти его только в модулях idIMAP *. RRUZ прав - POP3 не предлагает этой врожденной способности. В POP3 вам нужно отслеживать это на стороне клиента. Этот флаг был добавлен в IdMessage для целей IMAP, но не обязательно для POP3.

TIdMessageFlags, вероятно, должен был называться TIdIMAPMessageFlags

person Darian Miller    schedule 30.12.2010
comment
Переименование типа флагов в имя, специфичное для IMAP, означало бы создание специфичной для IMAP версии TIdMessage, что не идеально. Мы не хотим ограничивать то, как кодеры используют флаги. Тот факт, что POP3 не поддерживает флаги сообщений в протоколе, не означает, что кодировщик их не поддерживает. Например, представьте сценарий, в котором список объектов TIdMessage загружается и затем отображается. Кодировщик может использовать флаги вручную, чтобы указать, какие сообщения в памяти были просмотрены пользователем и т. Д. - person Remy Lebeau; 23.01.2011