|
Познающий
Регистрация: 07.06.2008
Сообщений: 48
Провел на форуме: 247923
Репутация:
52
|
|
Отправка сообщения с авторизацией
Отправка 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..
Причина: уточнил детали
|