Показать сообщение отдельно
  #4  
Старый 26.03.2014, 23:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 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 в.д.
Ответить с цитированием