Написал спамер на delphi но он почему то не хочет подключаться к SMTP серверу. Подскажите в чем проблема. Это на серверах стоит защита, или код кривой? Code: unit untMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Psock, NMsmtp, StdCtrls, IdWinsock, SmtpProt, IdBaseComponent, IdMessage, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, ExtCtrls, ComCtrls, Spin, Gauges; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Edit1: TEdit; IdSMTP1: TIdSMTP; Bevel1: TBevel; Label2: TLabel; Memo1: TMemo; Label3: TLabel; ComboBox1: TComboBox; Label4: TLabel; Edit2: TEdit; Label5: TLabel; Edit3: TEdit; DateTimePicker1: TDateTimePicker; Label6: TLabel; SpinEdit1: TSpinEdit; Label7: TLabel; Label8: TLabel; Edit4: TEdit; SpinEdit2: TSpinEdit; Label9: TLabel; Progress: TGauge; Label10: TLabel; Edit5: TEdit; Button2: TButton; CheckBox1: TCheckBox; CheckBox2: TCheckBox; Label11: TLabel; SpinEdit3: TSpinEdit; Label12: TLabel; SpinEdit4: TSpinEdit; Label13: TLabel; SpinEdit5: TSpinEdit; Label14: TLabel; Label15: TLabel; Label16: TLabel; SpinEdit6: TSpinEdit; Label17: TLabel; SpinEdit7: TSpinEdit; Label19: TLabel; Sost: TLabel; Label20: TLabel; Gauge1: TGauge; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); private { Private declarations } public { Public declarations } Stoped: Boolean; end; var Form1: TForm1; implementation {$R *.dfm} { smtp - ip адрес smtp сервера port - порт smtp сервера, по умолчанию 25 from - адрес отправителя dest - адрес получателя subject - тема письма body - текст писма Возвращает True если письмо было успешно отправленно... } function mail(smtp: string; port: integer; from, dest, subject, body: string): bool; const cl = #13#10; var WSAData: TWSAData; Host: TSockAddrIn; Sock: TSocket; res: Integer; buff: array[1..255] of Char; { отправляем данные через сокет } procedure senddata(str: string); var i: integer; begin for i := 1 to Length(str) do if send(Sock, str[i], 1, 0) = SOCKET_ERROR then exit; end; { получаем ответ от команды } function recvdata(accept: string): bool; var buff: array[1..255] of Char; begin res := recv(Sock, buff, SizeOf(buff), 0); Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept); end; begin try result := false; { инициализация сокета } WSAStartUp(257, WSAData); Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if Sock = INVALID_SOCKET then Exit; { устанавливаем хост и порт сервера } res := inet_addr(PChar(smtp)); if res <= 0 then exit; Host.sin_family := AF_INET; Host.sin_port := htons(port); Host.sin_addr.S_addr := res; { подключаемся к серверу } if connect(Sock, Host, SizeOf(Host)) > 0 then Exit; { приветствие сервера } if not recvdata('220') then Exit; { EHLO } senddata('EHLO' + cl); if not recvdata('250') then Exit; { MAIL FROM: } senddata('MAIL FROM:' + from + cl); if not recvdata('250') then Exit; { RCPT TO: } senddata('RCPT TO:' + dest + cl); if not recvdata('250') then Exit; { DATA } senddata('DATA' + cl); if not recvdata('354') then Exit; { отправляем текст сообщения } senddata('Subject:' + subject + cl + cl + body + cl + '.'); if not recvdata('250') then Exit; { отключаемся от сервера } senddata('QUIT' + cl); result := true; finally { убиваем сокет } closesocket(sock); WSACleanup; end; end; procedure TForm1.Button1Click(Sender: TObject); var Msg: TIdMessage; Count, i, tmp: Integer; Count2: Integer; function RandomString(Len: Integer): string; var i: Integer; begin Result := ''; for i := 1 to Len do Result := Result + Chr(32 + Random(224)); end; function RandomStringBody(Size: Integer): string; var i: Integer; SizeBody: Integer; begin Result := ''; SizeBody := (Size - 1) * 1024; for i := 1 to SizeBody do begin Result := Result + Chr(32 + Random(224)); Application.ProcessMessages; end; end; begin Count := SpinEdit2.Value; Progress.MaxValue := Count; Stoped := false; Count2 := SpinEdit6.Value; Gauge1.MaxValue := SpinEdit7.Value; IdSMTP1.Host := ComboBox1.Text; IdSMTP1.Port := SpinEdit1.Value; IdSMTP1.AuthenticationType := atLogin; IdSMTP1.UserId := Edit2.Text; IdSMTP1.Password := Edit3.Text; IdSMTP1.Connect; for i := Count - 1 downto 0 do begin Msg := TIdMessage.Create(nil); if not CheckBox2.Checked then Msg.Subject := Edit1.Text else Msg.Subject := RandomString(SpinEdit3.Value + Random(SpinEdit4.Value - SpinEdit3.Value)); Msg.Recipients.EMailAddresses := Edit4.Text; //указываем адрес получателя Msg.From.Address := Edit5.Text; if not CheckBox2.Checked then Msg.Body.Text := Memo1.Text else Msg.Body.Text := RandomStringBody(SpinEdit5.Value); Msg.Date := DateTimePicker1.Date; if Stoped then Break; if IdSMTP1.Connected then IdSMTP1.Send(Msg); Msg.Free; Sost.Caption := 'отправляем'; Progress.Progress := Count - i; Application.ProcessMessages; SpinEdit2.Value := i; if Count2 = 1 then begin Sost.Caption := 'пауза'; tmp := GetTickCount; while GetTickCount <= tmp + SpinEdit7.Value * 1000 do begin if Stoped then Break; Gauge1.Progress := (GetTickCount - tmp) div 1000; Application.ProcessMessages; end; Gauge1.Progress := 0; if Stoped then Break; Count2 := SpinEdit6.Value; end else begin Count2 := Count2 - 1; end; end; IdSMTP1.Disconnect; Progress.Progress := 0; Sost.Caption := 'выполнено'; end; procedure TForm1.FormCreate(Sender: TObject); begin DateTimePicker1.Date := Now; end; procedure TForm1.Button2Click(Sender: TObject); begin Stoped := true; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin SpinEdit3.Enabled := CheckBox2.Checked; SpinEdit4.Enabled := CheckBox2.Checked; Edit1.Enabled := not CheckBox2.Checked; if not CheckBox2.Checked then begin Label11.Font.Color := clDkGray; Label12.Font.Color := clDkGray; Label15.Font.Color := clDkGray; Label1.Font.Color := clBlack; end else begin Label11.Font.Color := clBlack; Label12.Font.Color := clBlack; Label15.Font.Color := clBlack; Label1.Font.Color := clDkGray; end; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin SpinEdit5.Enabled := CheckBox1.Checked; Memo1.Enabled := not CheckBox1.Checked; if not CheckBox1.Checked then begin Label13.Font.Color := clDkGray; Label14.Font.Color := clDkGray; Label2.Font.Color := clBlack; end else begin Label13.Font.Color := clBlack; Label14.Font.Color := clBlack; Label2.Font.Color := clDkGray; end; end; end.
А зачем велосипедить тем более на Delphi, если там есть SMTP клиент от Indy? Ну если хочется на чистых сокетах, то так же смотрим реализацию Indy.
Честно сказать мне лень копировать и смотреть в чем трабла Но могу дать совет, довольно таки актуальный Берёшь RFC 821 - SMTP и RFC 5321 - ESMTP - куришь их, если влом курить тогда Breakpoint Вам в помощь. Удачи в отладке При отладке кода по-моему всегда реально найти свои ошибки. P.S. Если ты не хочешь лишнего гемороя, то проще найти пример отправки письма через Indy и создать циклический поток флуда А вообще вот: _http://pastebin.ru/rC3hNXe3 Как то так короче, нашёл в своём старом проекте. разберёшься я думаю)
Я же скинул рабочий код, если ты умеешь создавать потоки и контролировать их действия - то я думаю проблем не составит написать консольную херню которая читает из файла и отправляет сообщения определённого типа))) Он даже с комментариями чувак