отправка данных на Delphi то smtp!

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Chakir, 20 Feb 2007.

Thread Status:
Not open for further replies.
  1. Chakir

    Chakir Elder - Старейшина

    Joined:
    17 Apr 2006
    Messages:
    34
    Likes Received:
    7
    Reputations:
    0
    я пишу консольное преложения на Delphi 7!
    Ивот какая проблемка был у меня модуль для отправкию через сокеты или с использованием винайпи я не знаю я не разберался. та я в этом сильно и не понемаю!
    вот смотрите я его подключил!
    Code:
    uses
      Windows,
      WinSock,
      uSMTP;
    потом сделал что мне надо сформеровал переменую!
    а вот тут и вступает модуль! от отправляет значение этой переменной мне на мыло!
    Code:
    Sent('smtp.mail.ru', 25,'mailemail@mail.ru','Chakir16@mail.ru', PChar(Dokis));
    А тут у меня проблема я потерял тот модуль кто небудь кто может помочь напищите этот модуль! (точнее мне его удалили!)
    плиз!!!??? :rolleyes:
     
    1 person likes this.
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    с тебя куча плюсов )))
    Code:
    function SendMail(SmtpServer:string;SmtpPort:integer;IsAuth:boolean;
    POP3Server:string;POP3Port:integer;POP3Login:string;POP3Password:string;
    FromAddr:string;ToAddr:string;MessageText:string):boolean;
    function LookupName(name:string):TInAddr;
    var
    HostEnt:PHostEnt;
    InAddr:TInAddr;
    begin
    if name[4]='.' then InAddr.s_addr:=inet_addr(PChar(name))
    else begin
    HostEnt:=gethostbyname(PChar(name));
    FillChar(InAddr,SizeOf(InAddr),0);
    if HostEnt<>nil then begin
    with InAddr, HostEnt^ do begin
    S_un_b.s_b1:=h_addr^[0];
    S_un_b.s_b2:=h_addr^[1];
    S_un_b.s_b3:=h_addr^[2];
    S_un_b.s_b4:=h_addr^[3];
    end;
    end
    end;
    Result:=InAddr;
    end;
    
    function RecvText(S:TSocket):string;
    const MAX_BUFF_SIZE=1024;
    var
    Recvbuff:array[0..MAX_BUFF_SIZE-1] of char;
    iRecv:integer;
    TempStr:string;
    begin
    Result:='';
    ZeroMemory(@Recvbuff,SizeOf(RecvBuff));
    iRecv:=recv(S,RecvBuff,MAX_BUFF_SIZE, 0);
    if iRecv=0 then exit
    else
    if iRecv=Socket_Error then exit
    else begin
    TempStr:=RecvBuff;
    Result:=Copy(TempStr,1,Pos(#13,TempStr));
    end;
    end;
    
    function SendText(S:TSocket;Text:string):boolean;
    const MAX_SEND_SIZE=1024;
    var
    SendBuff:array[0..MAX_SEND_SIZE] of char;
    iSend:integer;
    SendStr:string;
    begin
    Result:=false;
    SendStr:=Text+#13#10;
    if Length(SendStr)>MAX_SEND_SIZE then exit;
    CopyMemory(@SendBuff,PChar(SendStr),Length(SendStr));
    iSend:=send(S,SendBuff,Length(SendStr),0);
    if iSend=SOCKET_ERROR then exit;
    Result:=true;
    end;
    
    function POP3Auth(Server:string;Port:integer;Login,Pass:string):TSocket;
    var
    saServerPop3:SockAddr_In;
    RecvPop3Text,SendPop3Text:string;
    begin
    Result:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
    if Result=INVALID_SOCKET then exit;
    saServerPop3.sin_addr.s_addr:=htonl(INADDR_ANY);
    saServerPop3.sin_family:=AF_INET;
    saServerPop3.sin_port:=htons(Port);
    saServerPop3.sin_addr:=LookupName(Server);
    if connect(Result,saServerPop3,SizeOf(saServerPop3))=SOCKET_ERROR then begin
    Result:=-1;
    exit;
    end;
    RecvPop3Text:=RecvText(Result);
    if Pos('+OK',RecvPop3Text)=0 then begin
    CloseSocket(Result);
    Result:=-1;
    exit;
    end;
    SendPop3Text:='USER '+Login;
    if not SendText(Result,SendPop3Text) then begin
    CloseSocket(Result);
    Result:=-1;
    exit;
    end;
    RecvPop3Text:=RecvText(Result);
    if Pos('+OK',RecvPop3Text)=0 then begin
    CloseSocket(Result);
    Result:=-1;
    exit;
    end;
    SendPop3Text:='PASS '+Pass;
    if not SendText(Result,SendPop3Text) then begin
    CloseSocket(Result);
    Result:=-1;
    exit;
    end;
    RecvPop3Text:=RecvText(Result);
    if Pos('+OK',RecvPop3Text)=0 then begin
    CloseSocket(Result);
    Result:=-1;
    exit;
    end;
    end;
    
    procedure POP3Quit(S:TSocket);
    begin
    if not SendText(S,'QUIT') then begin
    CloseSocket(S);
    exit;
    end;
    CloseSocket(S);
    end;
    
    var
    WData:WSADATA;
    sMailSocket,sPOP3Socket:TSocket;
    saServerMail:SockAddr_In;
    RecvMailText,SendMailText:string;
    begin
    Result:=false;
    if WSAStartup(MAKEWORD(1,1),WData)<>0 then exit;
    sMailSocket:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
    if sMailSocket=INVALID_SOCKET then exit;
    saServerMail.sin_addr.s_addr:=htonl(INADDR_ANY);
    saServerMail.sin_family:=AF_INET;
    saServerMail.sin_port:=htons(SmtpPort);
    saServerMail.sin_addr:=LookupName(SmtpServer);
    if connect(sMailSocket,saServerMail,SizeOf(saServerMail))=SOCKET_ERROR then exit;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('220',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    exit;
    end;
    SendMailText:='HELO antichat.ru';
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    exit;
    end;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('250',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    exit;
    end;
    if IsAuth then begin
    sPOP3Socket:=POP3Auth(POP3Server,POP3Port,POP3Login,POP3Password);
    if sPOP3Socket=-1 then begin
    CloseSocket(sMailSocket);
    exit;
    end;
    end;
    SendMailText:='MAIL FROM:'+FromAddr;
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('250',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    SendMailText:='RCPT TO:'+ToAddr;
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('250',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    SendMailText:='DATA';
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('354',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    SendMailText:=MessageText;
    if not SendText(sMailSocket,SendMailText) then
    begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    SendMailText:=#13#10+'.';
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    RecvMailText:=RecvText(sMailSocket);
    if Pos('250',RecvMailText)=0 then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    SendMailText:='QUIT';
    if not SendText(sMailSocket,SendMailText) then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    if Pos('221',RecvText(sMailSocket))=0 then begin
    CloseSocket(sMailSocket);
    if IsAuth then CloseSocket(sPOP3Socket);
    exit;
    end;
    if IsAuth then POP3Quit(sPOP3Socket);
    CloseSocket(sMailSocket);
    Result:=true;
    end;
    
    begin
    SendMail('smtp.mail.ru',25,false,'',110,'','','FROM@mail.ru','TO@mail.ru','Text here');
    end.
    Ну CODE то для кого?!
     
    #2 W!z@rD, 20 Feb 2007
    Last edited by a moderator: 20 Feb 2007
    1 person likes this.
  3. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    на самом деле все выглядит на много проще:

    Если ты хочешь наблюдать за общением сервер - клиент то так:

    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;
    
    если ты не хочешь видеть отчеты (для вируса) как в данном случае то так:
    Code:
    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;
     
    1 person likes this.
  4. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    Забыл, юзать так:
     
    #4 t04, 23 Feb 2007
    Last edited: 23 Feb 2007
  5. Chakir

    Chakir Elder - Старейшина

    Joined:
    17 Apr 2006
    Messages:
    34
    Likes Received:
    7
    Reputations:
    0
    не я ввсё помню и помню левое мыло!
     
  6. Chakir

    Chakir Elder - Старейшина

    Joined:
    17 Apr 2006
    Messages:
    34
    Likes Received:
    7
    Reputations:
    0
    всем пасиб со всем разобрался тему закрывайте !
     
Thread Status:
Not open for further replies.