Форум: "WinAPI";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
ВнизE-Mail & Winsock. Найти похожие ветки
← →
paul_shmakov (2002-01-15 11:07) [2]вот, только что набросал. пример показывает посылку самого простого письма. остальные поля в заголовке (типа Subject) и диалог с smtp сервером см. в rfc.
да и коды, которые сервер возвращает - это я так, на примере сейчас посмотрел - точно не помню. так что за дополнительной информацией RFC 0821.
program mail;
uses Windows, SysUtils, Winsock;
function SendMail(const From: string; const Receiver: string; const Text: string;
const SmtpHost: string; SmtpPort: Word = 25): Boolean;
var
S: TSocket;
WSData: TWSAData;
function ConnectToSmtp: Boolean;
var
Sin: SockAddr_in;
IP: DWord;
He: PHostent;
begin
Result := false;
IP := inet_addr(PChar(SmtpHost));
if INADDR_NONE = IP then
begin
He := gethostbyname(PChar(SmtpHost));
if not Assigned(He) then
Exit;
IP := PDWord(PDWord(He^.h_addr_list)^)^;
end;
S := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if INVALID_SOCKET <> S then
begin
FillChar(Sin, SizeOf(Sin), 0);
Sin.sin_family := AF_INET;
Sin.sin_port := htons(SmtpPort);
Sin.sin_addr.s_addr := IP;
Result := SOCKET_ERROR <> connect(S, Sin, SizeOf(Sin));
if not Result then
closesocket(S);
end;
end;
function SendCommand(Text: string): Boolean;
var
Buffer: PChar;
Size: Integer;
begin
Text := Text + #10;
Size := Length(Text);
GetMem(Buffer, Size + 1);
try
StrCopy(Buffer, PChar(Text));
Result := send(S, Buffer^, Size, 0) <> SOCKET_ERROR;
finally
FreeMem(Buffer);
end;
end;
function ReceiveResponse: Integer;
var
Response: string;
C: Char;
begin
Result := 0;
Response := "";
repeat
if SOCKET_ERROR = recv(S, C, SizeOf(C), 0) then
Exit;
Response := Response + C;
until C = #10;
if Pos(" ", Response) > 0 then
Result := StrToIntDef(Copy(Response, 1, Pos(" ", Response) - 1), 0)
else
Result := StrToIntDef(Response, 0);
end;
begin
Result := false;
WSAStartup($0101, WSData);
try
if ConnectToSmtp then
try
ReceiveResponse;
Result :=
SendCommand("helo delphimail") and (250 = ReceiveResponse) and
SendCommand("mail from: " + From) and (250 = ReceiveResponse) and
SendCommand("rcpt to: " + Receiver) and (250 = ReceiveResponse) and
SendCommand("data") and (354 = ReceiveResponse) and
SendCommand(Text + #10"."#10) and (250 = ReceiveResponse) and
SendCommand("quit") and (250 = ReceiveResponse);
finally
closesocket(S);
end;
finally
WSACleanup;
end;
end;
begin
SendMail("<billy@microsoft.com>", "<paul_shmakov@mail.ru>", "Hello from Billy!", "smtp.mail.ru");
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c