Цитата:
Сообщение от W!z@rD
с тебя куча плюсов )))
Код:
function SendMail(SmtpServer : String;
SmtpPort : Word;
IsAuth : Boolean;
POP3Server : String;
POP3Port : Word;
POP3Login : String;
POP3Password: String;
FromAddr : String;
ToAddr : String;
MessageText : String): Boolean;
<...>
begin
SendMail('smtp.mail.ru',25,false,'',110,'','','FROM@mail.ru','TO@mail.ru','Text here');
end.
Ну CODE то для кого?!
|
на самом деле все выглядит на много проще:
Если ты хочешь наблюдать за общением сервер - клиент то так:
Код:
function Rus(mes: string):string;
var
i: integer;
begin
for i:=1 to length(mes) do
case mes[i] of
'А'..'п' : mes[i] := Chr(Ord(mes[i]) - 64);
'р'..'я' : mes[i] := Chr(Ord(mes[i]) - 16);
end;
rus := mes;
end;
function SendMail(Smtp: PChar; Port: dword; From, Dest, Data: PChar): boolean;
var
FSocket:Integer;
HostEnt: PHostEnt;
SockAddrIn: TSockAddrIn;
dBuff: PChar;
dSize: dword;
Str: array [0..255] of Char;
(**************************************************************************)
function Success(): boolean;
var
Bytes: dword;
RBuff: array [0..255] of Char;
begin
Result := false;
Bytes := recv(FSocket, RBuff, 255, 0);
if (Bytes = 0) or (Bytes = SOCKET_ERROR) then Exit;
Write(Rus('[вход. сообщ.] '),RBuff);
RBuff[3] := #0;
if RBuff='221' then
WriteLn(Rus('[вход. сообщ.] Ответ о состоянии системы или помощь')+#10)else
if RBuff='214' then
WriteLn(Rus('[вход. сообщ.] Сообщение-подсказка (помощь)')+#10)else
if RBuff='220' then
WriteLn(Rus('[вход. сообщ.] '),SMTP,Rus(' служба готова к работе')+#10)else
if RBuff='221' then
WriteLn(Rus('[вход. сообщ.] '),SMTP,Rus(' служба закрывает канал связи')+#10)else
if RBuff='250' then
WriteLn(Rus('[вход. сообщ.] Запрошенное действие почтовой транзакции успешно завершилось')+#10)else
if RBuff='251' then
WriteLn(Rus('[вход. сообщ.] Данный адресат не является местным; сообщение будет передано по маршруту <forward-path>')+#10)else
if RBuff='354' then
WriteLn(Rus('[вход. сообщ.] Начинай передачу сообщения. Сообщение заканчивается комбинацией CRLF-точка-CRLF')+#10)else
if RBuff='421' then
WriteLn(Rus('[вход. сообщ.] '),SMTP,Rus(' служба недоступна; соединение закрывается')+#10)else
if RBuff='450' then
WriteLn(Rus('[вход. сообщ.] Запрошенная команда почтовой транзакции не выполнена, так как почтовый ящик недоступен')+#10)else
if RBuff='451' then
WriteLn(Rus('[вход. сообщ.] Запрошенная команда не выполнена; произошла локальная ошибка при обработке сообщения')+#10)else
if RBuff='452' then
WriteLn(Rus('[вход. сообщ.] Запрошенная команда не выполнена; системе не хватило ресурсов')+#10)else
if RBuff='500' then
WriteLn(Rus('[вход. сообщ.] Синтаксическая ошибка в тексте команды; команда не опознана')+#10)else
if RBuff='501' then
WriteLn(Rus('[вход. сообщ.] Синтаксическая ошибка в аргументах или параметрах команды')+#10)else
if RBuff='502' then
WriteLn(Rus('[вход. сообщ.] Данная команда не реализована')+#10)else
if RBuff='503' then
WriteLn(Rus('[вход. сообщ.] Неверная последовательность команд')+#10)else
if RBuff='504' then
WriteLn(Rus('[вход. сообщ.] У данной команды не может быть аргументов')+#10)else
if RBuff='551' then
WriteLn(Rus('[вход. сообщ.] Данный адресат не является местным; попробуйте передать сообщение по маршруту <forward-path>')+#10)else
if RBuff='552' then
WriteLn(Rus('[вход. сообщ.] Запрошенная команда почтовой транзакции прервана; дисковое пространство, доступное системе, переполнилось')+#10)else
if RBuff='553' then
WriteLn(Rus('[вход. сообщ.] Запрошенная команда не выполнена; указано недопустимое имя почтового ящика')+#10)else
if RBuff='554' then
WriteLn(Rus('[вход. сообщ.] Транзакция не выполнена')+#10)else
WriteLn(Rus('[вход. сообщ.] '),RBuff,Rus(': Неопознанный код команды с SMTP сервера')+#10);
if lstrcmp(RBuff, '220') = 0 then Result := true else
if lstrcmp(RBuff, '250') = 0 then Result := true else
if lstrcmp(RBuff, '354') = 0 then Result := true;
end;
(**************************************************************************)
begin
Result := false;
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_port := htons(Port);
SockAddrIn.sin_addr.s_addr := inet_addr(Smtp);
if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
begin
HostEnt := gethostbyname(Smtp);
if HostEnt = nil then
begin
closesocket(FSocket);
Exit;
end;
SockAddrIn.sin_addr.s_addr := PLongint(HostEnt^.h_addr_list^)^;
end;
if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> -1 then
begin
if Success then
begin
lstrcpy(Str, PChar('HELO ' + Smtp + #13#10#0));
//WriteLn(Rus('[исх. сообщ:] '),FSocket, Str, lstrlen(Str), 0);
WriteLn(Rus('[исх. сообщ:] HELLO...'));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('MAIL FROM: ' + From + #13#10#0));
//WriteLn(Rus('[исх. сообщ:] '),FSocket, Str, lstrlen(Str), 0);
WriteLn(Rus('[исх. сообщ:] MAIL FROM...')+#10);
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('RCPT TO: ' + Dest + #13#10#0));
//WriteLn(Rus('[исх. сообщ:] '),FSocket, Str, lstrlen(Str), 0);
WriteLn(Rus('[исх. сообщ:] RCPT TO...')+#10);
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, 'DATA'#13#10#0);
//WriteLn(Rus('[исх. сообщ:] '),FSocket, Str, lstrlen(Str), 0);.
WriteLn(Rus('[исх. сообщ:] DATA...')+#10);
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
dSize := lstrlen(Data);
GetMem(dBuff, dSize + 6);
lstrcpy(dBuff, Data);
lstrcat(dBuff, #13#10'.'#13#10#0);
//WriteLn(Rus('[исх. сообщ:] '),FSocket, dBuff^, dSize + 6, 0);
WriteLn(Rus('[исх. сообщ:] Buf^ Sending...')+#10);
send(FSocket, dBuff^, dSize + 6, 0);
FreeMem(dBuff);
if Success then
begin
lstrcpy(Str, 'QUIT'#13#10#0);
//WriteLn(Rus('[исх. сообщ:] '),FSocket, Str, lstrlen(Str), 0);
WriteLn(Rus('[исх. сообщ:] QUIT')+#10);
send(FSocket, Str, lstrlen(Str), 0);
Result := true;
end;
end;
end;
end;
end;
end;
end;
closesocket(FSocket);
end;
если ты не хочешь видеть отчеты (для вируса) как в данном случае то так:
Код:
function SendMail(Smtp: PChar;
Port: DWORD;
From,
Dest,
Data: PChar): Boolean;
var
FSocket : integer;
HostEnt : PHostEnt;
SockAddrIn : TSockAddrIn;
WSAData : TWSAData;
dBuff : PChar;
dSize : DWORD;
Str : Array [0..255] of Char;
function Success(): Boolean;
var
Bytes: dword;
RBuff: array [0..255] of Char;
begin
Result := false;
Bytes := recv(FSocket, RBuff, 255, 0);
if (Bytes = 0) or (Bytes = SOCKET_ERROR) then Exit;
RBuff[3] := #0;
if lstrcmp(RBuff, '220') = 0 then Result := true else
if lstrcmp(RBuff, '250') = 0 then Result := true else
if lstrcmp(RBuff, '354') = 0 then Result := true;
end;
begin
WSAStartup(257, WSAData);
Result := false;
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_port := htons(Port);
SockAddrIn.sin_addr.s_addr := inet_addr(Smtp);
if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
begin
HostEnt := gethostbyname(Smtp);
if HostEnt = nil then
begin
CloseSocket(FSocket);
Exit;
end;
SockAddrIn.sin_addr.s_addr := PLongint(HostEnt^.h_addr_list^)^;
end;
if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> -1 then
begin
if Success then
begin
lstrcpy(Str, PChar('HELO ' + Smtp + #13#10#0));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('MAIL FROM: ' + From + #13#10#0));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('RCPT TO: ' + Dest + #13#10#0));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, 'DATA'#13#10#0);
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
dSize := lstrlen(Data);
GetMem(dBuff, dSize + 6);
lstrcpy(dBuff, Data);
lstrcat(dBuff, #13#10'.'#13#10#0);
send(FSocket, dBuff^, dSize + 6, 0);
FreeMem(dBuff);
if Success then
begin
lstrcpy(Str, 'QUIT'#13#10#0);
send(FSocket, Str, lstrlen(Str), 0);
Result := true;
end;
end;
end;
end;
end;
end;
end;
CloseSocket(FSocket);
WSACleanup();
end;
|