Форум: "Сети";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];
ВнизКак послать 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c