Вот код отправки письма при отправке логина кодированного base64
(письмо отправляется на mail.ru) smtp-сервер долго ниче не отвечает
(прога ждет) потом присылает в ответе "421 ... SMTP command timeout - closing connection", причем WSAGetLastError возвращает ноль, то есть ошибок при отправке и доставке не было. В чем может быть дело?
Код:
program mailled;
uses
windows,
winsock2;
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 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 exit;
///вот здесь получаю 421 и типа таймаут от сервера}
{ 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.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился