Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2017, 13:54   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Почта. Как получить отправителя, тему, дату, не "читая" письмо?

Здравствуйте!
Скопировал, чуток подработал, получилась программка, которая можетскачивать определённые вложения по определённому отправителю.
Потом решил попробовать сделать просмотр почты на Python. Просто просмотр, без заморочки с вложениями. Кое-как, не до конца, что-то получилось.
И вот что я заметил: через python при просмотре почты они не начинают отображаться как прочитанные. А через дельфи начинают... Можно ли как-то сделать так, чтобы и в Delphi тоже они оказывались непрочитанными? Или хотя бы можно ли получить список "От кого", "Тема", "Время и дата" так, чтобы сообщение не становилось от этого прочитанным?
Делал через TIdIMAP4, DelphiXE, Яндекс.
Подозреваю, что прочитанными они становятся после
Код:
idIMAP41.Retrieve(i, idMessage1);
Подумал, может, дело в
Код:
idMessage1.Flags:=idMessage1.Flags+[mfSeen];
Вроде бы выглядит логично. Сначала сдвинул его на пару строк вверх - внутрь if. Не помогло. Потом вообще закомментировал. Всё равно не помогло. Удивился и продолжаю не понимать: так где же избавиться от "прочитано"?

На всякий случай полный код процедуры:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j:integer;
  TargetDir : string; //полный путь, куда сохранять
  FilNm:string;
  TmpStrL:TStringList;
begin
   IdIMAP41.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
   IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3;
   IdIMAP41.UseTLS    := utUseImplicitTLS;

   IdIMAP41.Username  := login;
   IdIMAP41.Password  := password;
   IdIMAP41.Host      := 'imap.yandex.ru';
   IdIMAP41.Port      := 993;
   try
      IdIMAP41.Connect;
   except
      showmessage('Error!');
      exit;
   end;

   TargetDir:=ExtractFilePath(Application.ExeName);
   IdIMAP41.SelectMailBox('INBOX'); // INBOX входящие
   Label1.Caption := IntToStr(IdIMAP41.MailBox.TotalMsgs); // количество писем
   for i := IdIMAP41.MailBox.TotalMsgs downto IdIMAP41.MailBox.TotalMsgs-5 do
   begin
     idIMAP41.Retrieve(i, idMessage1);
     if idMessage1.From.Address=some_from then
     begin
       idMessage1.MessageParts.CountParts; //разобрали на запчасти
       for J:= 0 to idMessage1.MessageParts.Count-1 do //на случай, если прицеплен не один файл
       begin
         if (idMessage1.MessageParts.Items[j] is TIdAttachment) then
         begin
           if Trim((idMessage1.MessageParts.Items[j]).FileName)<>'' then
           begin
             FilNm := AnsiString(Trim((idMessage1.MessageParts.Items[j]).FileName));
             ShowMessage(ExtractFileExt(FilNm));
             if ExtractFileExt(FilNm)='.txt' then
               (idMessage1.MessageParts.Items[j] as TIdAttachment).SaveToFile(TargetDir+FilNm);
          end;
         end;
       end;
     end;
     ListBox1.Items.Add(idMessage1.From.Address+' '+idMessage1.Subject);
     idMessage1.Flags:=idMessage1.Flags+[mfSeen];
   end;
    IdIMAP41.Disconnect;
    IdIMAP41.IOHandler.Free;
end;
Ship_1 вне форума Ответить с цитированием
Старый 19.05.2017, 16:00   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Если достаточно только "От кого", "Время" и "Дата", то может стоит только заголовки скачивать:

Код:
TidIMAP4.RetrieveAllHeaders
или

Код:
TIdIMAP4.ReceiveHeader

Я настолько глубоко в Инди не уходил, но видится, что там на одном Retrieve свет клином не сошёлся.

UPDATE Вот тут описаны некоторые методы для поп3, думаю, для аймапа тоже актуально.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 19.05.2017 в 16:16.
Sciv вне форума Ответить с цитированием
Старый 22.05.2017, 09:53   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Спасибо Тоже подумал про эти функции, но при RetrieveAllHeaders программа то зависала намертво, то ругалась на какой-то другой порт. А вот ReceiveHeader помог. Подумал, что при RetrieveAllHeaders виснет из-за огромного числа писем.
Вроде, проблему можно считать решённой, при ReceiveHeader прочитанным не становится. Спасибо!

P.S. За ссылку на статью отдельное спасибо, поизучаю на досуге.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
"заблочить тему", чтобы даже не выдавалась в "новых сообщениях" TaLadno О форуме и сайтах клуба 0 08.04.2016 14:30
NOD 32 выругался при заходе в тему "Литература в помощь при работе с базами данных", что в разделе "БД в Delphi" Вадим Мошев О форуме и сайтах клуба 4 09.11.2014 10:14
Как занести текущую дату в поле таблицы типа "Дата"? Женя32 БД в Delphi 22 25.10.2013 15:19
PHP(или другой язык): Получить все пары "имя" -> "значение" переданные методом POST KingOfNothing PHP 4 12.04.2009 14:06