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

Отправка сообщения с авторизацией
  #7  
Старый 16.12.2008, 18:59
RaX
Познающий
Регистрация: 07.06.2008
Сообщений: 48
Провел на форуме:
247923

Репутация: 52
Отправить сообщение для RaX с помощью ICQ
По умолчанию Отправка сообщения с авторизацией

Отправка e-mail с авторизацией


Т.к часто возникает такая проблема, вот код для Delphi в консоли. Программа читает текст из файла message.txt и отправляет его на ide4@rambler.ru с ящика rax_08@mail.ru (укажите свой).
Код:
{(C)2008 by RaX}
program mail;

{$APPTYPE CONSOLE}

uses
  SysUtils, WinSock, Windows;

function lookupname(str: string): TInAddr;
var
  _hostEnt:PHostEnt;
  _inAddr:TInAddr;
begin
  if (lowerCase(str)[1] IN ['a'..'z']) OR
      (lowerCase(str)[2] IN ['a'..'z']) then
  begin
    _hostEnt := getHostByName(pchar(str));
    FillChar(_inAddr, sizeOf(_inAddr), 0);
    if _hostEnt<>nil then
    begin
      with _hostEnt^, _inAddr 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
  else
    _inAddr.s_addr := inet_addr(pchar(str));

 Result:= _inAddr;
end;

function GetLocalHost: string;
var
 sh : array [0..255] of char;
begin
 if gethostname(sh, 255)=0 then
  Result := StrPas(sh)
 else
  Result := '';
end;

procedure SendStr(s:TSocket; str:String);
var
 sRecvBuff : array [0..255] of char;
 TempStr : AnsiString;
 i:integer;
begin

 TempStr:=str+#13+#10;
 CopyMemory(@sRecvBuff, PChar(TempStr), Length(TempStr));
 i:=send(s, sRecvBuff, Length(TempStr), 0);

 writeln('>'+str);
end;

procedure GetStr(s:TSocket);
var
  TempStr : AnsiString;
  sRecvBuff : array [0..255] of char;
begin
 recv(s, sRecvBuff, SizeOf(sRecvBuff), 0);
 TempStr:=sRecvBuff;
 writeln('<'+Copy(TempStr, 1, Pos(#13, TempStr)));
end;

var
 wData : WSADATA;
 sServerListen, suser: TSOCKET;
 server_addr, user_addr : sockaddr_in;
 sRecvBuff : array [0..255] of char;
 TempStr:AnsiString;
 i, iRet:Integer;
begin

 // Загрузка WinSock
 if WSAStartup(MAKEWORD(1,1), wData) <> 0 then
	begin
   writeln('WinSock error!');
   readln;
   exit;
	end;

 // Создание сокета
  suser := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
 if suser = INVALID_SOCKET then
  begin
   writeln('Socket error!');
   readln;
   exit;
  end;

 // Запонение структуры адреса POP3
 user_addr.sin_addr.s_addr := htonl(INADDR_ANY);
 user_addr.sin_family := AF_INET;
 user_addr.sin_port := htons(110);
 user_addr.sin_addr := LookupName('pop.mail.ru');

 if (connect(suser, user_addr, sizeof(user_addr)) = SOCKET_ERROR) then
  begin
   writeln('Connection error!');
   readln;
   exit;
  end;

 getstr(suser);
 sendstr(suser,'USER rax_08');
 getstr(suser);
 sendstr(suser,'PASS 1234546');
 getstr(suser);

 sServerListen := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
 if sServerListen = INVALID_SOCKET then
  begin
   writeln('Socket error!');
   readln;
   exit;
  end;

 // Запонение структуры адреса SMTP
 server_addr.sin_addr.s_addr := htonl(INADDR_ANY);
 server_addr.sin_family := AF_INET;
 server_addr.sin_port := htons(587);
 server_addr.sin_addr := LookupName('smtp.mail.ru');

 if (connect(sServerListen, server_addr, sizeof(server_addr)) = SOCKET_ERROR) then
  begin
   writeln('Connection error!');
   readln;
   exit;
  end;

  sleep(100);

 getstr(sServerListen);
 sleep(100);
 // Приветствие сервера

  sendstr(sServerListen,'HELO '+GetLocalHost);

  getstr(sServerListen);

  sendstr(sServerListen,'MAIL FROM: rax_08@mail.ru');

 // От
 getstr(sServerListen);
 // Кому
 sendstr(sServerListen,'RCPT TO:<ide4@rambler.ru>');
 getstr(sServerListen);
 // Начало отправки данных сообщения
 sendstr(sServerListen,'DATA');
 sleep(1000);
 getstr(sServerListen);


 // От
 sendstr(sServerListen,'From: rax_08@mail.ru');
 // Кому
 sendstr(sServerListen,'To:<ide4@rambler.ru>');
 // Кодировка, в данном случае стоит отправка с HTML
 sendstr(sServerListen,'Mime-Version: 1.0'+#13+#10+'Content-Type: text/html; charset="us-ascii');

//Читаем сообщение из файла
 assign(input,'message.txt');
 reset(input);
 while not eof do
  begin
   // Сообщение

   readln(TempStr);
   while TempStr<>'' do
    begin
     CopyMemory(@sRecvBuff, PChar(TempStr), Length(TempStr));
     iRet:=send(sServerListen, sRecvBuff, Length(TempStr), 0);

     if iRet=SOCKET_ERROR then
      break;

     writeln('>'+Copy(TempStr, 1, Pos(#13, TempStr)));

     Delete(TempStr, 1, iRet);
    end;
  end;

  close(input);

 // Конец сообщения
 sendstr(sServerListen,#13+#10+'.');
 getstr(sServerListen);

 // Выход
 sendstr(sServerListen,'QUIT');

 sendstr(suser,'QUIT');

  getstr(suser);

 CloseSocket(suser);

 CloseSocket(sServerListen);


end.

Последний раз редактировалось RaX; 18.01.2010 в 18:47.. Причина: уточнил детали
 
Ответить с цитированием