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

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

E-Mail & Winsock. [D5, Win2k]


Страницы:   1 2

BWG ©   (2002-01-14 19:00:00) 

Мастера!
Понимаю, что тема избита, но так никто толком не ответил на вопрос: как написать процедуру отправки E-Mail, используя один только Winsock API. Помогите чем можите!


paul_shmakov   (2002-01-17 13:45:00) [21]

может не работать по той причине, что smtp.narod.ru не позволяет вход без авторизации. попробуй telnet-ом туда подсоединиться. диалог у вас с ним примерно такой должен получиться:

220 ESMTP MAIL.RU Thu, 17 Jan 2002 13:31:42 +0300
helo delphimail
250 mx10.port.ru Hello delphimail [10.0.0.1]
mail from: <billy@microsoft.com>
250 <billy@microsoft.com> is syntactically correct
rcpt to: <paul_shmakov@mail.ru>
250 <paul_shmakov@mail.ru> verified
data
354 Enter message, ending with "." on a line by itself
hello from billy!!!
.
250 OK id=16R9qY-0007Ut-00
quit
221 mx10.port.ru closing connection

если это пройдет, то значит и программа должна работать. приведенная выше функция - это реализация этого диалога на сокетах.
правда, скорее всего потребуется авторизация :(

кстати, то, что Вы исправили #10 на #13#10 - это правильно (сейчас rfc посмотрел).

SMTP RFC 0821
http://www.ietf.org/rfc/rfc0821.txt?number=0821


Polevi   (2002-01-17 13:43:00) [22]

У меня работает без всяких исправлений (кроме аргументов ф-ии)


BWG   (2002-01-17 13:35:00) [23]

Нет вроде. Надо бы... Пошел проверять...


Polevi   (2002-01-17 08:43:00) [24]

Коды возврата проверял ?


BWG   (2002-01-16 17:20:00) [25]

Не работает этот код. Уже застрелился понимать почему. Исправил в function SendCommand(Text: string): Boolean;строку Text := Text + #10;на Text := Text + №13#10;, строку SendMail("<billy@microsoft.com>", "<paul_shmakov@mail.ru>", "Hello from Billy!", "smtp.mail.ru");на строку SendMail("<one@prog.ru>", "<bwgblackraven@narod.ru>", "Date: "+ DateTimeToStr(now)+#13#10+"From: one@prog.ru"+#13#10+ "To: <bwgblackraven@narod.ru>"+#13#10+"Subject: Mail"+ #13#10#13#10+"The test", "smtp.narod.ru"). Все равно не работает!

Помогите понять: ПОЧЕМУ?


paul_shmakov   (2002-01-15 11:07:00) [26]

вот, только что набросал. пример показывает посылку самого простого письма. остальные поля в заголовке (типа Subject) и диалог с smtp сервером см. в rfc.
да и коды, которые сервер возвращает - это я так, на примере сейчас посмотрел - точно не помню. так что за дополнительной информацией RFC 0821.

program mail;

uses Windows, SysUtils, Winsock;

function SendMail(const From: string; const Receiver: string; const Text: string;
const SmtpHost: string; SmtpPort: Word = 25): Boolean;
var
S: TSocket;
WSData: TWSAData;

function ConnectToSmtp: Boolean;
var
Sin: SockAddr_in;
IP: DWord;
He: PHostent;
begin
Result := false;

IP := inet_addr(PChar(SmtpHost));

if INADDR_NONE = IP then
begin
He := gethostbyname(PChar(SmtpHost));
if not Assigned(He) then
Exit;
IP := PDWord(PDWord(He^.h_addr_list)^)^;
end;

S := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if INVALID_SOCKET <> S then
begin
FillChar(Sin, SizeOf(Sin), 0);
Sin.sin_family := AF_INET;
Sin.sin_port := htons(SmtpPort);
Sin.sin_addr.s_addr := IP;

Result := SOCKET_ERROR <> connect(S, Sin, SizeOf(Sin));

if not Result then
closesocket(S);
end;
end;

function SendCommand(Text: string): Boolean;
var
Buffer: PChar;
Size: Integer;
begin
Text := Text + #10;
Size := Length(Text);
GetMem(Buffer, Size + 1);
try
StrCopy(Buffer, PChar(Text));
Result := send(S, Buffer^, Size, 0) <> SOCKET_ERROR;
finally
FreeMem(Buffer);
end;
end;

function ReceiveResponse: Integer;
var
Response: string;
C: Char;
begin
Result := 0;

Response := "";
repeat
if SOCKET_ERROR = recv(S, C, SizeOf(C), 0) then
Exit;

Response := Response + C;
until C = #10;

if Pos(" ", Response) > 0 then
Result := StrToIntDef(Copy(Response, 1, Pos(" ", Response) - 1), 0)
else
Result := StrToIntDef(Response, 0);
end;

begin
Result := false;
WSAStartup($0101, WSData);
try
if ConnectToSmtp then
try
ReceiveResponse;
Result :=
SendCommand("helo delphimail") and (250 = ReceiveResponse) and
SendCommand("mail from: " + From) and (250 = ReceiveResponse) and
SendCommand("rcpt to: " + Receiver) and (250 = ReceiveResponse) and
SendCommand("data") and (354 = ReceiveResponse) and
SendCommand(Text + #10"."#10) and (250 = ReceiveResponse) and
SendCommand("quit") and (250 = ReceiveResponse);
finally
closesocket(S);
end;
finally
WSACleanup;
end;
end;

begin
SendMail("<billy@microsoft.com>", "<paul_shmakov@mail.ru>", "Hello from Billy!", "smtp.mail.ru");
end.


BWG   (2002-01-15 04:53:00) [27]

Неужели никто не знает?
Или просто лень ответить?


Страницы:   1 2

Наверх

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