на отправке логина сервер долго не отвечает (прога ждет)пишет "421 ... SMTP command timeout - closing connection", а WSAGetLastError не ругается и возвращает ноль, в чем может быть дело
Код (Text): program mailled; uses windows, winsock2; { smtp - ip адрес smtp сервера port - порт smtp сервера, по умолчанию 25 from - адрес отправителя dest - адрес получателя subject - тема письма body - текст писма Возвращает True если письмо было успешно отправленно... } type TaPInAddr = Array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; const Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'; var Host: PHostEnt; pptr: PaPInAddr; WSAData: TWSAData; function Encode64(S: string): string; var i,a,x,b: integer; begin result := ''; a := 0; b := 0; for i := 1 to Length(s) do begin x := Ord(s[i]); b := b * 256 + x; a := a + 8; while a >= 6 do begin a := a - 6; x := b div (1 shl a); b := b mod (1 shl a); result := result + Codes64[x + 1]; end; end; if a > 0 then begin x := b shl (6 - a); result := result + Codes64[x + 1]; end; end; {function Decode64(S: string): string; var i,a,x,b: integer; begin result := ''; a := 0; b := 0; for i := 1 to length(s) do begin x := pos(s[i], codes64) - 1; if x >= 0 then begin b := b * 64 + x; a := a + 6; if a >= 8 then begin a := a - 8; x := b shr a; b := b mod (1 shl a); x := x mod 256; result := result + chr(x); end; end else exit; end; end;} function mail(smtp: PChar; port: integer; from, dest, subject,body: string): bool; const cl = #13#10; var Host: TSockAddrIn; Sock: TSocket; res: Integer; { отправляем данные через сокет } 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; { инициализация сокета } Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if Sock = INVALID_SOCKET then Exit; { устанавливаем хост и порт сервера } res := inet_addr(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' + string(smtp) + cl); if not recvdata('250') then Exit; { AUTH LOGIN } senddata('AUTH LOGIN' {+ string(smtp)} + cl); if not recvdata('334') then Exit; { LOGIN } senddata(encode64('<login>')); if not recvdata('334') then {вот здесь получаю 421 и тип таймаут от сервера} Exit; { PASSWORD } senddata(encode64('<password>')); if not recvdata('235') 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); end; end; begin if WSAStartUp(257, WSAData) <> 0 then exit; host := GetHostByName('smtp.mail.ru'); if host = nil then begin WSACleanup; halt; end; pPtr := PaPInAddr(host^.h_addr_list); if pPtr <> nil then mail(inet_ntoa(pPtr^[0]^),25,'...@mail.ru','...@list.ru','Automatic sending','Hello, I am the machine'); WSACleanup; end.