Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

Как удалить сразу все сообщения в почтовом ящике?   Найти похожие ветки 

 
Sam Dozer   (2005-08-25 17:46) [0]

Хочу написть программку которая удаляла бы спам из
почтового ящика. проблема всатала, когда появилась необходимость
удаления реально большого количества писем (тысячи!)

раньше использовал

IdPOP31.Delete(i);

где i - был номер письма (из цикла FOR). а вот как удалить
все письма сразу или, что было бы лучше
с n-номера по m-номер...

Может кто подскажет или ссылку даст?
или мне другой компонент заюзать (заместо IdPOP31)?


 
имя   (2005-08-25 18:58) [1]

Удалено модератором


 
Rouse_ ©   (2005-08-25 18:59) [2]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ScktComp;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit3: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   GroupBox1: TGroupBox;
   Button1: TButton;
   Memo1: TMemo;
   ClientSocket1: TClientSocket;
   Edit2: TEdit;
   Label3: TLabel;
   Button2: TButton;
   Label4: TLabel;
   Edit4: TEdit;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
   procedure ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Disconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure Button2Click(Sender: TObject);
   procedure Edit4KeyPress(Sender: TObject; var Key: Char);
   procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   Step: Integer;
   MailCount: Integer;
   CurrentMail: Integer;
   NoDel: Boolean;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 NoDel := True;
 Step := 0;
 Memo1.Lines.Clear;
 ClientSocket1.Host := Edit1.Text;
 try
   ClientSocket1.Port := StrToInt(Edit4.Text);
 except
   Memo1.Lines.Add("Неверный порт");
   Exit;
 end;
 ClientSocket1.Active := True;
 Memo1.Lines.Add("Соединяюсь с " + Edit1.Text);
 Edit1.Enabled := False;
 Edit2.Enabled := False;
 Edit3.Enabled := False;
 Edit4.Enabled := False;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

 if MessageBoxEx(Handle, "Удалить все письма из почтового ящика?",
   "Подтверждение...", MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2,
   LANG_NEUTRAL) = IDNO then Exit;

 NoDel := False;
 Step := 0;
 Memo1.Lines.Clear;
 ClientSocket1.Host := Edit1.Text;
 try
   ClientSocket1.Port := StrToInt(Edit4.Text);
 except
   Memo1.Lines.Add("Неверный порт");
   Exit;
 end;
 ClientSocket1.Active := True;
 Memo1.Lines.Add("Соединяюсь с " + Edit1.Text);
 Edit1.Enabled := False;
 Edit2.Enabled := False;
 Edit3.Enabled := False;
 Edit4.Enabled := False;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 Txt: String;
 Parser: TStringList;
begin
 Txt := Socket.ReceiveText;
 //Memo1.Lines.Add("<<< "+Txt);

 if Txt[1] = "-" then
 begin
   Memo1.Lines.Add("Ошибка!!!");
   Socket.SendText("QUIT");
   ClientSocket1.Active := False;
   MailCount := 0;
   CurrentMail := 0;
   Step := 0;
   Exit;
 end;

 if Txt[1] <> "+" then Exit;

 case Step of
   0:
   begin
     Inc(Step);
     Memo1.Lines.Add("Аутентификация:"+#13#10+#13#10+"Отправка имени пользователя...");
     Txt := "USER " + Edit2.Text + #10#13;
     Socket.SendText(Txt);
   end;
   1:
   begin
     Inc(Step);
     Memo1.Lines.Add("Отправка пароля...");
     Txt := "PASS " + Edit3.Text + #10#13;
     Memo1.Lines.Add(">>> "+Txt);
     Socket.SendText(Txt);
   end;
   2:
   begin
     Memo1.Lines.Add("Аутентификация успешна");
     Inc(Step);
     Memo1.Lines.Add("Получения количества писем...");
     Txt := "STAT" + #10#13;
     Socket.SendText(Txt);
   end;
   3:
   begin
     Parser := TStringList.Create;
     Parser.Text := StringReplace(Txt, " ", #13#10, [rfReplaceAll]);
     MailCount := StrToInt(Parser.Strings[1]);
     if MailCount = 0 then
     begin
       Memo1.Lines.Add("Письма в почтовом ящике отсутствуют");
       ClientSocket1.Active := False;
       Exit;
     end;
     Memo1.Lines.Add("Писем в почтовом ящике: " + Parser.Strings[1]);
     Memo1.Lines.Add("Их общий размер: " + Parser.Strings[2] + #13#10);
     Parser.Free;
     if NoDel then
     begin
       ClientSocket1.Active := False;
       Exit;
     end;
     Inc(Step);
     CurrentMail := 1;
     Memo1.Lines.Add("Приступаю к удалению...");
     Memo1.Lines.Add("Запрос на удаление письма №" + IntToStr(CurrentMail) + "...");
     Txt := "DELE " + IntToStr(CurrentMail) + #10#13;
     Socket.SendText(Txt);
   end;
   4:
   begin
     Memo1.Lines.Add("Принят");
     if CurrentMail < MailCount then
     begin
       Inc(CurrentMail);
       Memo1.Lines.Add("Запрос на удаление письма №" + IntToStr(CurrentMail) + "...");
       Txt := "DELE " + IntToStr(CurrentMail) + #10#13;
       Socket.SendText(Txt);
     end
     else
     begin
       Inc(Step);
       Memo1.Lines.Add("Все запросы завершены");
       Memo1.Lines.Add("Подтверждаю удаление...");
       Txt := "QUIT" + #10#13;
       Socket.SendText(Txt);
     end;
   end;
   5:
   begin
     Memo1.Lines.Add("Удаление завершено");
     Memo1.Lines.Add("Удалено писем: " + IntToStr(MailCount));
     ClientSocket1.Active := False;
   end;
 end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Memo1.Lines.Add("Соединение установлено");
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Memo1.Lines.Add("Соединение завершено");
 Edit1.Enabled := True;
 Edit2.Enabled := True;
 Edit3.Enabled := True;
 Edit4.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ClientSocket1.Active := False;
end;

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
 if not(Key in ["0".."9", #8]) then Key := #0;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 Memo1.Lines.Add("Ошибка!!!");
 ErrorCode := 0;
end;

end.


 
Sam Dozer   (2005-08-25 19:56) [3]

Спасибо, но пока у меня че-то не работает...
Edit1 - пишу: pop.mail.ru
Edit2 - логин
Edit3 - пароль
Edit4 - порт (110)
Нажимаю кнопку1, здесь вроде все ок, модем маргнет пару раз,
далее жму кнопку3, модем еще пару раз моргнет,
подождет, подождет, потом вылезет ошибка
типа ошибка сокета какая-то...
А кнопка2 я не понял для чего нужна...

Я шо-то не так сделал? А можно файлы этого проекта?


 
Piter ©   (2005-08-25 20:06) [4]

Rouse_ ©   (25.08.05 18:59) [2]

ну ведь это тоже самое, что и автор делал, просто в цикле удаляешь по одному письму...


 
Anatoly Podgoretsky ©   (2005-08-25 21:23) [5]

где i - был номер письма (из цикла FOR). а вот как удалить
все письма сразу или, что было бы лучше
с n-номера по m-номер...

for I := n to m do
  IdPOP31.Delete(i);


 
Piter ©   (2005-08-25 22:38) [6]

Anatoly Podgoretsky ©   (25.08.05 21:23) [5]

Анатолий, ну зачем же непонимающего из себя строить. Прочитайте внимательнее.

Имеется в виду одна комманда, но в POP протоколе по-моему такого нет.
Автор хочет типа того, просто послать комманду:

"DELE from 1 to 10"
В цикле он и так делал.

Что в общем-то логично. При плохом Dial-up удаление там 500 писем может растянуться значительно по времени, было бы куда удобнее все письма одной коммандой удалить.
НО опять же - вроде в POP  протоколе такого нету...


 
Rouse_ ©   (2005-08-26 10:33) [7]

> При плохом Dial-up удаление там 500 писем может растянуться
> значительно по времени, было бы куда удобнее все письма
> одной коммандой удалить.

Делаем RTFM ;) В цикле помечаются письма к удалению, пока я не сделаю QUIT никакого удаления не произодет.
В любой момент я могу отказаться от удаления того или иного письма отправив RSET...


 
Sam Dozer   (2005-08-26 12:01) [8]

А помечать в цикле письма к удалению это не займет много времени?
А можно поподробнее?


 
Piter ©   (2005-08-26 13:41) [9]

Rouse_ ©   (26.08.05 10:33) [7]

да какая разница? Блин, фишка в том, что нужно последовательно давать 500 комманд.
А автор хочет одной коммандой.


 
Anatoly Podgoretsky ©   (2005-08-26 14:01) [10]

Piter ©   (25.08.05 22:38) [6]
Удаление 500 писем вряд ли займет и секунду, это всего лишь установка флажка. Ну пускай 10 секунд для медленного диалапа. Не то это время.


 
Rouse_ ©   (2005-08-26 14:11) [11]

> А автор хочет одной коммандой.
Через IMAP, SELECT + DELETE + EXPUNGE. Правда не эксперементировал...


 
Anatoly Podgoretsky ©   (2005-08-26 14:15) [12]

Piter ©   (25.08.05 22:38) [6]
Зачем гадать, когда есть руководящие материалы


 
Piter ©   (2005-08-26 14:43) [13]

Anatoly Podgoretsky ©   (26.08.05 14:01) [10]
Ну пускай 10 секунд для медленного диалапа. Не то это время.


несогасен. У меня безлимит, и то зачастую письма на хостингах удаляются значительное время. Ну допустим писем 20 секунды за 2.

Вы, конечно, скажите - меняй почтового провайдера и все такое. Все понятно.

Но есть же реальные сервера и реальная работа. Причем, ощущение, что независит от типа комманды, просто у сервера есть какой-то отклик на комманду, какая бы это комманды не была, наверное из-за загруженности.

Поэтому есть мнение, что одна комманда по удалению 500 писем была бы куда эффективнее чем 500 комманд по удалению одногно письма.


 
Sam Dozer   (2005-08-26 17:41) [14]

Да, на эту тему можно конечно должно беседовать,
но может меня просветят еще в одном вопросе:
многопоточность...
Вот например, у меня есть три ящика и мне их нужно
очистить (черт с ним как, пусть через 500 команд),
можноли как то сделать, что бы ящики очищались
параллельно, т.е. одновременно,
типа посылать одновременно команды?
Как вообще организуется многопоточность?
Если кто-то кинет ссылку или разьяснит - буду очень признателен!


 
Alex D.   (2005-08-27 00:08) [15]

Не помню с какого сайта, но думаю стоящее:

-----
Можно много и очень долго говорить о многозадачности и многопоточности, о це-лесообразности использования потоков и т.д. и т.п. Но я не буду "лить воду". Скажу лишь, что прежде чем создавать отдельный поток, сначала подумайте, нужно ли это в Вашей программе. Ведь для создания даже маленького потока необходимы ресур-сы системы. Целесообразно в поток помещать процедуры, требующие достаточно большого времени выполнения, например поиск файлов, загрузка файлов из Интер-нета, работа с сетевой базой данных, создание сложных визуальных эффектов и т.д.
И так…
Класс TThread.

Для начала немного теории, которая понадобится нам для создания первого примера приложения с потоком.
Самое первое и самое главное: TThread - АБСТРАКТНЫЙ класс!!! Т.е. НИКОГДА не используйте его напрямую, а то потом долго не разберетесь, откуда появляется ошибка! Для использования класса TThread необходимо создать класс-потомок:

type
TMyThread = Class (TThread);

end;

Вот некоторые методы класса TThread, которые нам понадобятся для начала:
constructor Create(CreateSuspended: Boolean);
procedure Resume;
procedure Suspend;
function Terminate: Integer ;

procedure Execute; virtual; abstract;
procedure Synchronize (Method: TThreadMethod);

Параметр конструктора Create означает, как будет запущен поток после создания: немедленно (False) или попозже (True). Если Вы создали поток с параметром True, то для его запуска необходимо будет вызвать метод Resume.
Suspend - приостанавливает выполнение потока;
Resume - продолжает выполнение потока;
Terminate - пытается завершить поток путем установки свойства Terminated в True. Для прекращения выполнения потока во время работы, необходимо периодически проверять свойство Terminated в пределах метода Execute (см. ниже) и во всех мето-дах, которые Execute вызывает, и выходить, если Terminated=True.
Execute - содержит основной код потока, т.е. те действия, которые Вы решили по-местить в поток. Если Вы обратили внимание, этот метод абстрактный, т.е. его надо переопределять в пределах Вашего класса-потомка TThread.
Synchronize - используется для предотвращения одновременного доступа разных потоков к одному элементу VCL. Дело в том, что код VCL выполняется в главном потоке программы, так что поток должен синхронизироваться, если он использует код VCL. Параметр метода - это метод без параметров, который обычно принадле-жит Вашему потоковому классу.
И еще одно: не желательно создавать элементы VCL в потоке, т.к. сообщения системы не будут посылаться манипуляторам окон, созданных в потоке. Правда есть некоторые элементы VCL, которые являются потокозащищенными. Это TCanvas, который имеет методы Lock и UnLock, которые запрещают и разрешают (соответст-венно) доступ к канве для других потоков. Кроме того, класс TThreadList позволяет нескольким потокам работать с TList.

Ну вот, немного теории уже есть, пора и к практике переходить :-)
Давайте для примера создадим простую программу, которая будет что-то, например - крестики, выводить на канву формы в единственном потоке.
Для этого нам понадобится создать новый проект, на форму которого нужно будет поместить всего две кнопки - Botton1 и Button2, а в секцию private описания формы добавим

PT : TMyThread;

Далее создадим свой собственный потоковый класс (перед описанием класса фор-мы!):

type
TmyThread = class (TThread)
private
X, Y, Color : Integer;
protected
procedure Execute; override;
procedure Paint;
end;

Далее, естественно, опишем методы Execute и Paint:

procedure TMyThread.Execute;
begin
Randomize;
X:=0;Y:=0;
repeat
X:=Random(Form1.Width);
Y:=Random(Form1.Height);
Color:=Random($FFFFFFFF);
{в методе Paint происходит обращение к элементу VCL - Canvas, по-этому необходима синхронизация}
Synchronize (Paint);
until Terminated;
end;

procedure TMyThread.Paint;
begin
with Form1.Canvas do begin
{рисуем крестики :-)}
Pixels[X,Y-1]:=Color;
Pixels[X+1,Y]:=Color;
Pixels[X-1,Y]:=Color;
Pixels[X,Y+1]:=Color;
Pixels[X,Y]:=Color;
end;
end;

И не забудем создать обработчики для кнопок:

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:=False;
Button2.Enabled:=True;
PT:=TMyThread.Create(False); // запустить поток сразу
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled:=True;
Button2.Enabled:=False;
PT.Free; // уничтожить поток
end;

Вот и все. Запускаем, должно получиться :-)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.041 c
14-1131977614
Koala
2005-11-14 17:13
2005.12.04
Нужна помощь в выборе DVD


1-1131584384
Dementiy
2005-11-10 03:59
2005.12.04
Browse For Folder Dialog


1-1130204643
маленький человек
2005-10-25 05:44
2005.12.04
Частичная прозрачность


2-1132216536
Катерина
2005-11-17 11:35
2005.12.04
Работа с Сanvas


14-1131908927
Виталий11111
2005-11-13 22:08
2005.12.04
Модератор пидар!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский