Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.02.2014, 03:52
ivankom ivankom вне форума
Прохожий
 
Регистрация: 04.02.2014
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Чтение и удаление сообщений через imap4, нужна помошь в оптимизации кода

Всем привет!
Есть такая программка, которая будет через imap4 обрабатывать входящие сообщения, и затем удалять.
Код:
var
  i: integer;
begin
    IdIMAP41.Host := 'host';
    IdIMAP41.Port := 993;
    IdIMAP41.Username := 'login';
    IdIMAP41.Password := 'pass';
    IdIMAP41.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdIMAP41);
    IdIMAP41.UseTLS := utUseImplicitTLS;
    IdIMAP41.Connect;
    idIMAP41.SelectMailBox('INBOX');
for i := 1 to IdIMAP41.MailBox.TotalMsgs do
    begin
        idIMAP41.Retrieve(i, idMessage1);
        Memo1.Text := Memo1.Text+'Тема: '+idMessage1.Subject+#13#10+'Отправитель: '+idMessage1.From.Text+#13#10+'Сообщение: '+idMessage1.Body.Text+#13#10+'---///---'+#13#10;

        idIMAP41.DeleteMsgs(i);
        idIMAP41.ExpungeMailBox;
    end;
    IdIMAP41.Disconnect;
    IdIMAP41.IOHandler.Free;
end;


end.
Как правильно написать код, чтобы письма в ящике обрабатывались последовательно, сначала обработалось первое сообщение, удалилось, а потом переходило ко второму.
Сейчас работает так: обрабатываются первые несколько писем и удаляются, а остальные остаются.
Ответить с цитированием
  #2  
Старый 05.02.2014, 23:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Проверок на ошибки явно не хватает, вот что-то подобное
Код:
// Автор: Альф  (2006-01-11 12:42)
function CheckMailByUID(): integer;
var
 i: integer;
 path, msguid: string;
 filename: TFileName;
 amsglist: TIdMessageCollection;
begin
 result:= 0;
 path:= "D:\mail\inbox.msg\";
 IdIMAP.Connect();
 if IdIMAP.Connected
 then try
   if IdIMAP.SelectMailBox("INBOX")
   then try
     amsglist := TIdMessageCollection.Create(TIdMessageItem);
     if IdIMAP.UIDRetrieveAllEnvelopes(amsglist)
     then begin
       for i := 0 to amsglist.Count -1 do begin
         Application.ProcessMessages();

         msguid := (amsglist.Items[i] as TIdMessageItem).IdMessage.UID;
         if IdIMAP.UIDRetrieve(msguid, IdMessage)
         then begin
           filename := MsgIdToFileName(IdMessage.MsgId);
           IdMessage.SaveToFile(path + filename);

           if FileExists(path + filename)
           then begin
// После этого можно со спокойной совестью удалять письмо из ящика
             if not IdIMAP.UIDDeleteMsg(msguid)
             then begin
// Ошибка - Удаление не прошло
             end;
             result := result + 1;
           end else begin
// Ошибка - Сохранить не получилось
           end;
         end else begin
// Ошибка - Не получилось принять сообщение # + IntToStr(i)
         end;
       end;
// Перепаковать выбраный ящик
       if not IdIMAP.ExpungeMailBox()
       then begin
// Ошибка - Ликвидация провалилась
       end;
     end else begin
     end;

   finally
     amsglist.Free();
   end else begin
// Ошибка - Не удалось выбрать почтовый ящик
   end;
 finally
   IdIMAP.Disconnect();
 end else begin
// Ошибка - Не удалось подключиться к IMAP4
 end;
end;
Ответить с цитированием
  #3  
Старый 06.02.2014, 06:28
ivankom ivankom вне форума
Прохожий
 
Регистрация: 04.02.2014
Сообщения: 21
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

В общем замут в IDшниках сообщений.
Поменял
Код:
for i := 1 to IdIMAP41.MailBox.TotalMsgs do
на
Код:
for i := IdIMAP41.MailBox.TotalMsgs downto 1 do
после этого они начали нормально обрабатываться и удаляться.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter