Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Как послать e-mail с машины без единой почтовой программы?   Найти похожие ветки 

 
cosinus ©   (2007-07-26 12:57) [0]

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


 
umbra ©   (2007-07-26 13:04) [1]


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

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


 
DVM ©   (2007-07-26 13:05) [2]

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

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

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


 
cosinus ©   (2007-07-26 13:10) [3]


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

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


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


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


Да.


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


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


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


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


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


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

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


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

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


 
DVM ©   (2007-07-26 13:24) [6]


> 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;


 
ShyricK ©   (2007-07-29 13:47) [7]

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


 
VirEx ©   (2007-07-30 13:21) [8]


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

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


 
Anatoly Podgoretsky ©   (2007-07-30 19:21) [9]

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

И спаммер.



Страницы: 1 вся ветка

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
9-1169641924
k8
2007-01-24 15:32
2008.05.04
координаты мышки в пространстве


15-1205948943
Express
2008-03-19 20:49
2008.05.04
Компонент для Клавиатурного тренажерa


10-1144224575
DancerMan
2006-04-05 12:09
2008.05.04
TWebbrowser. Клик по ссылке -> MyProcedure


15-1201816478
Eraser
2008-02-01 00:54
2008.05.04
Remote Office Manager - бета тестирование 2


15-1205743389
REA
2008-03-17 11:43
2008.05.04
GPS перехват