
26.03.2014, 23:15
|
 |
.
|
|
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
|
|
Нужна, как называют школяры, "скрытная" отправка. То есть, программа подключена по Com-порту к железке и при некоторых критических действиях должна отсылать пользователю уведомление. Набираю команды в Telnet-е, всё нормально, на те же команды из программы получаю ответ - Нераспознанная команда. Взял довольно распространённый в сети код и пытаюсь экспериментировать с ним.
Код:
function CreateMailMessage : Boolean;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
WSAData : TWSAData;
Host : TSockAddrIn;
Sock : TSocket;
HostE : PHostEnt;
Server : AnsiString;
function SendData(St : AnsiString) : Boolean;
var
Buf : array[0..1023] of AnsiChar;
begin
FillChar(Buf, SizeOf(Buf), 0);
MoveMemory(@Buf[0], @St[1], Length(St));
Result := send(Sock, Buf, Length(St) + 1, 0) > SOCKET_ERROR + 1;
end;
function RecvData(accept : AnsiString) : BOOL;
var
Buf : array[0..1023] of AnsiChar;
begin
res := recv(Sock, Buf, SizeOf(Buf), 0);
Result := (Res = SOCKET_ERROR) or (Copy(Buf, 0, 3) = accept);
end;
begin
Result := False;
WSAStartUp(257, WSAData);
try
Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if Sock = INVALID_SOCKET then
Exit;
try
Server := Copy(Settings.Mail, Pos('@', Settings.Mail) + 1, Length(Settings.Mail));
HostE := GetHostByName(PAnsiChar('smtp.' + Server));
if HostE = NIL then
Exit;
FillChar(Host, SizeOf(TSockAddrIn), 0);
Host.sin_family := AF_INET;
Host.sin_port := htons(25);
Host.sin_addr.S_addr := inet_addr(inet_ntoa(PInAddr(HostE.h_addr_list^)^));
if connect(Sock, Host, SizeOf(Host)) > 0 then
Exit;
if not RecvData('220') then
Exit;
// EHLO
SendData('EHLO ' + Server + #13#10);
if not RecvData('250') then
Exit;
SendData('STARTTLS'#13#10);
if not RecvData('250') then // Тут уже сбой
Exit;
SendData('AUTH LOGIN'#13#10);
if not RecvData('250') then
Exit;
// MAIL FROM:
SendData('MAIL FROM:' + Settings.Mail + #13#10);
if not RecvData('250') then
Exit;
// RCPT TO:
SendData('RCPT TO:' + Settings.Mail + #13#10);
if not RecvData('250') then
Exit;
// DATA
SendData('DATA' + #13#10);
if not RecvData('354') then
Exit;
SendData('Subject: ' + 'MAP monitoring - Error' + #13#10#13#10 + 'Test' + #13#10 + '.');
if not RecvData('250') then
Exit;
SendData('QUIT' + #13#10);
Result := True;
finally
closesocket(sock);
end;
finally
WSACleanup;
end;
Затык происходит на любой команде после приветствия.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
|