Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как послать e-mail с машины без единой почтовой программы? [D7, Win2k, WinXP]


cosinus ©   (2007-07-26 12:57:00) 

Собственно весь вопрос в теме.
Все примеры, которые я пока нашел используют почтовую программу по умолчанию, а это не то. Как правило на серверы не ставят Outlook или Bat )))
Необходимо при определенных условиях посылать сообщение с алертом на ящик. Предпологается, что прога мониторит некоторые события и по достижении оных, посылает сообщение по внутренней почте об этом. Почтовый сервер - Exchange, если это имеет какое-нибудь значение )


Anatoly Podgoretsky   (2007-07-30 19:21:00) [1]

> VirEx  (30.07.2007 13:21:08)  [8]

И спаммер.


VirEx   (2007-07-30 13:21:00) [2]


>  [7] ShyricK ©   (29.07.07 13:47)
> То ест как я понял при помощи это можно отослать письмо
> невидимо для пользователя?

ога! попался. троянописатель)


ShyricK   (2007-07-29 13:47:00) [3]

То ест как я понял при помощи это можно отослать письмо невидимо для пользователя?


DVM   (2007-07-26 13:24:00) [4]


> cosinus ©  


function SendEMail(SmtpServer: string;
                  Port: integer;
                  Login, Password: string;
                  From,
                  Dest,
                  Subject,
                  Body,
                  FileName: string): boolean;
const
 CRLF = #13#10;
 Boundary = 'myboundary';
var
 WSAData: TWSAData;
 WsaErr: integer;
 SAddr: TSockAddrIn;
 Sock: TSocket;
 SmtpHost: PHostEnt;
 SmtpIP: PChar;
 Rcv: string;
 Attach: string;
 
 procedure SendData(Str: string);
 var
   i: integer;
 begin
   for i := 1 to Length(str) do
     if send(Sock, str[i], 1, 0) = SOCKET_ERROR then exit;
 end;

{ procedure SendData(Str: string);
 begin
   if send(Sock, Str[1], Length(Str), 0) = SOCKET_ERROR then exit;
 end;}

 function RecvCode: string;
 var
   buff: array[0..1024] of Char;
   Res: integer;
 begin
   Result := '';
   ZeroMemory(@buff, SizeOf(buff));
   res := recv(Sock, buff, SizeOf(buff), 0);
   if res <> SOCKET_ERROR then
     begin
       Result := Copy(buff, 1, 3);
     end;
 end;

begin
 result := false;
 try
   WsaErr := WSAStartUp($101, WSAData);
   if WsaErr <> 0 then exit;
   SmtpHost := GetHostByName(PChar(SmtpServer));
   if SmtpHost = nil then exit;
   SmtpIP := inet_ntoa(PInAddr(SmtpHost.h_addr_list^)^);
   if SmtpIP = nil then exit;
   ZeroMemory(@SAddr, SizeOf(SAddr));
   with SAddr do
     begin
       sin_family := AF_INET;
       sin_port := htons(Port);
       sin_addr.S_addr := Inet_Addr(SmtpIP);
     end;
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);  
   if Sock = INVALID_SOCKET then exit;
   if Connect(Sock, SAddr, SizeOf(SAddr)) > 0 then exit;
   
   if RecvCode <> '220' then exit;
   SendData('EHLO ' + SmtpServer + CRLF);
   if RecvCode <> '250' then exit;

   SendData('AUTH LOGIN ' + EncodeBase64(Login) + CRLF);
   Rcv := RecvCode;
   if  Rcv <> '334' then
     begin
       if Rcv <> '403' then exit;
     end
   else
     begin
       SendData(EncodeBase64(Password) + CRLF);
       if RecvCode <> '235' then exit;
     end;

   senddata('MAIL FROM:' + From + CRLF);
   if RecvCode <> '250' then exit;

   senddata('RCPT TO:' + Dest + CRLF);
   if RecvCode <> '250' then exit;

   senddata('DATA' + CRLF);
   if RecvCode <> '354' then exit;

   senddata('Subject: =?Windows-1251?B?' + EncodeBase64(From) + '?=' + CRLF);
   senddata('To: ' + Dest + CRLF);

   senddata('Subject: =?Windows-1251?B?' + EncodeBase64(Subject) + '?=' + CRLF);

   senddata('MIME-Version: 1.0' + CRLF);
   senddata('Content-Type: multipart/mixed; boundary="' + Boundary + '"' + CRLF);
   senddata(CRLF);

   if Body <> '' then
   begin
     senddata('--' + Boundary + CRLF);
     senddata('Content-Type: text/plain; charset=Windows-1251' + CRLF);
     senddata('Content-transfer-encoding: base64' + CRLF + CRLF);
     Body := EncodeBase64(Body);
     senddata(Body + CRLF);
   end;

   if FileName <> '' then
     if FileExists(FileName) then
       begin
         senddata('--' + Boundary + CRLF);
         senddata('Content-Type: ' + GetMIMEType(FileName) + '; name="' + ExtractFileName(FileName) + '"' + CRLF);
         senddata('Content-transfer-encoding: base64' + CRLF);
         senddata('Content-Disposition: attachment; filename="' + ExtractFileName(FileName) + '"' + CRLF + CRLF);
         Attach := EncodeFile(FileName);
         senddata(Attach);
       end;

   senddata(CRLF + '.' + CRLF);
   if RecvCode <> '250' then exit;
   senddata('QUIT' + CRLF);
   result := true;
 finally
   CloseSocket(Sock);
   WSACleanup;
 end;
end;


DVM   (2007-07-26 13:21:00) [5]


> То есть используя сокеты, я могу подключиться к Exchange
> к существующему ящику, отправить с него почту, и "отвалиться
> обратно" от почтового сервера, правильно?

Да. Так же как это делает почтовая программа. Можно даже через telnet из командной строки это сделать.


> Насколько трудна реализация необходимой мне задачи, с учетом
> того, что я никогда не работал с сокетами?

Не трудна эта задача вовсе. Особенно если для отправки использовать готовые компоненты. Типа TIdSmtp


Сергей М.   (2007-07-26 13:19:00) [6]


> используя сокеты, я могу подключиться к Exchange к существующему
> ящику, отправить с него почту, и "отвалиться обратно" от
> почтового сервера, правильно?


Да.


> Как правило на серверы не ставят Outlook или Bat


Но это отнюдь не говорит о том, что на сервере заведомо не установлен ни один mail-клиент.


> Насколько трудна реализация


Все относительно в сравнении.


cosinus   (2007-07-26 13:10:00) [7]


> DVM ©   (26.07.07 13:05) [2]

Позвольте я все же уточню....
То есть используя сокеты, я могу подключиться к Exchange к существующему ящику, отправить с него почту, и "отвалиться обратно" от почтового сервера, правильно?
И еще один вопросик, чтобы просто я знал, чего ждать... Насколько трудна реализация необходимой мне задачи, с учетом того, что я никогда не работал с сокетами? То есть придется ли мне перечитать 200 страниц о сокетах и смежных областях для этого или же достаточно будет пару статей и хелп?


DVM   (2007-07-26 13:05:00) [8]

Очень просто - через сокеты.

WsaStartUp()
socket()
connect()
recv()
send()
closesocket()
WsaCleanUp()

что должно приниматься и предаваться см описание протокола SMTP


umbra   (2007-07-26 13:04:00) [9]


> Собственно весь вопрос в теме.

ответ - никак. Хоть какая-нибудь программа должна быть.


Наверх

Титульная страница Поиск, карта сайта Написать письмо