|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Чтение и удаление сообщений через 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
|
||||
|
||||
Проверок на ошибки явно не хватает, вот что-то подобное
Код:
// Автор: Альф (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
|
|||
|
|||
В общем замут в IDшниках сообщений.
Поменял Код:
for i := 1 to IdIMAP41.MailBox.TotalMsgs do Код:
for i := IdIMAP41.MailBox.TotalMsgs downto 1 do |