Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.027 c
4-1128005817
jack128
2005-09-29 18:56
2005.12.04
Какое сообщение приходит TPageControl у при клике мышой


4-1127833308
фывыч
2005-09-27 19:01
2005.12.04
о tprocessentry32


14-1132024353
Glosariy
2005-11-15 06:12
2005.12.04
ПОМОГИТЕ ПОЖАЛУЙСТА ОЧЕНЬ НУЖНО!!!!!!! Поиск в базе данных


5-1114678262
Damir
2005-04-28 12:51
2005.12.04
Ошибка при компиляции компонента


2-1132231417
md
2005-11-17 15:43
2005.12.04
узнать разницу между числами