program MySendMail;
uses Winsock;
var
wsadata: TWSADATA;
Addr: TSockAddrIn;
sock: TSocket;
Buf_r: array[0..255] of char;
f : TextFile;
const
MailFrom ='delphi@mail.ru';
MailTo = 'mymail@inbox.ru';
CRLF = #13+#10;
Title = 'Test Title';
Body = 'Test Body';
MySmtp = 'smtp.mail.ru';
procedure init;
begin
AssignFile(f,'History.txt');
Rewrite(f);
end;
procedure Sends(str : String);
var
i: integer;
begin
for i:=1 to Length(str) do if send(sock,str,1,0)=SOCKET_ERROR then exit;
end;
procedure CheckAnswer(str : String);
var
Answer : integer;
begin
Answer:=Recv(sock,Buf_r,sizeof(Buf_r),0);
if (Answer=SOCKET_ERROR) or (Answer=0) then
begin
WriteLn(f,str);
CloseFile(f);
Halt;
end else WriteLn(f,'Server:'+Buf_r);
end;
begin
init;
WSAStartUp($0101, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
Addr.sin_family:=PF_Inet;
Addr.sin_port:=HtoNS(25);
Addr.sin_addr.S_addr:=Inet_Addr(PChar(MySmtp));
FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
Connect(sock,Addr,sizeof(Addr));
CheckAnswer('Error: Connection!');
// HELLO
Sends('HELO Yaroslaw'+CRLF);
CheckAnswer('Error: Hello!');
// MAIL FROM:
Sends('MAIL FROM:'+MailFrom+CRLF);
CheckAnswer('Error: Mail From!');
// RCPT TO:
Sends('RCPT TO:'+MailTo+CRLF);
CheckAnswer('Error: Mail To!');
// DATA
Sends('DATA'+CRLF);
CheckAnswer('Error: Data!');
// Send Body
Sends(Title+CRLF);
Sends(Body+CRLF);
// <CRLF>.<CRLF> End of Body
Sends(CRLF+'.'+CRLF);
CheckAnswer('Error: End of Body!');
// QUIT
Sends('QUIT'+#13+#10);
CheckAnswer('Error: Quit!');
Shutdown(sock, SD_Both);
CloseSocket(sock);
WSACleanup;
CloseFile(f);
end.
Отправка письма из Delphi используя Winsock
Написал вот такую вот программу, а она не работает. Подскажыте плз в чем ошыбка. ПС.Использовал диалог с сервером.
Вместо
Цитата:
MySmtp = 'smtp.mail.ru';
должно быть
Цитата:
MySmtp = '194.67.23.111';
MySmtp должно быть ip-адресом, посколько Addr.sin_addr.S_addr имеет тип integer.
ПС.Чтобы узнать ip-адрес зная доменное имя нужно в cmd набрать:
Код:
ping -a имя (пример: ping -a smtp.mail.ru)