![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как послать 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]
> Собственно весь вопрос в теме.
ответ - никак. Хоть какая-нибудь программа должна быть.