Показать сообщение отдельно

  #3  
Старый 23.02.2007, 03:46
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

Цитата:
Сообщение от 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;