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. Помогите чем можите!


BWG   (2002-01-20 08:31:00) [1]

Хорошо, хорошо.
Сейчас полностью оттестирую и тогда выложу все результаты.


paul_shmakov   (2002-01-20 01:56:00) [2]

2 BWG:
Так вот, повторяю свою мысль. По словам Павла Шумакова если с помощью телнета
Шмаков я :)

удалось подулючиться - значит и код будет работать. С помощью телнета подключиться удалось. Код - ни в какую!

ну запустите под отладчиком и оттрассируйте. код делает (должен делать) именно то, что и человек, набирающий команды в окне telnet-терминала.
код вполне может глючить - я его за пару минут написал специально для ответа на Ваш вопрос.


Ghost.   (2002-01-19 21:55:00) [3]

Вообще 550 озачает, что почтовый ящик недоступен..ты навертное это знаешь и без меня, а на счет телнета мысль очень хорошая я тоже так делал...когда отпртавлял через маил ру и только с помощью телнета разобрался, чо если отправляешь не с их ящика или не на их ящик север возращает ошибку 553 и оказалось, что если ввести любой адрес (чужой) но их сертвера все пройдет нормально и получатель получит письмо с левого ящика..попробуй телетом всю тртанзакцию провести


Anatoly Podgoretsky   (2002-01-19 21:48:00) [4]

Для того что бы сказать хороший или нет сперва надо дать определение этого. Меня в большинстве случаев устраивает, в некоторых других я использую TereTerm, но чаще именно первый.


BWG   (2002-01-19 19:29:00) [5]

2 Anatoly Podgoretsky © (19.01.02 19:14) Это хороший, да? Я даже оттуда лог не могу скопировать!

Так вот, повторяю свою мысль. По словам Павла Шумаковаесли с помощью телнета удалось подулючиться - значит и код будет работать. С помощью телнета подключиться удалось. Код - ни в какую!

Помогите!!!


Anatoly Podgoretsky   (2002-01-19 19:14:00) [6]

Start|Run|Telnet


BWG   (2002-01-19 12:10:00) [7]

Кстати: подскажите хороший Telnet-клиент (F reeware).


BWG   (2002-01-18 20:50:00) [8]

Заставить работать Яндекс( smtp.yandex.ru port 25) удалось. Отправил все без вопросов. Этот код - ни в какую не хочет работать!


BWG   (2002-01-17 21:50:00) [9]

Ладно.
Пошел разбираться.


paul_shmakov   (2002-01-17 18:33:00) [10]

2 Bachin:
все нормально, вот только что-то он на quit ругнулся (???)
а в остальном все именно так и должно быть


Bachin   (2002-01-17 18:02:00) [11]

Уменя такой диалог. Только не пойму, где он пустую команду откопал :(

220 profix.kiev.ua ESMTP Sendmail 8.12.1/8.12.1; Thu, 17 Jan 2002 16:59:17 +0200 (EET)
helo delphimail
250 profix.kiev.ua Hello bachin.profix.com [196.1.4.13], pleased to meet you
mail from: <bachin@prifix.kiev.ua>
250 2.1.0 <bachin@prifix.kiev.ua>... Sender ok
rcpt to: <bachin@usb.kherson.ua>
250 2.1.5 <bachin@usb.kherson.ua>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
test message
.

250 2.0.0 g0HExHVN029445 Message accepted for delivery
quit
500 5.5.1 Command unrecognized: ""
FALSE


BWG   (2002-01-17 17:06:00) [12]

Не пойму чего-то. То ли получается, то ли нет. Может у меня ручки кривые.
Попробуйте, please, кто-нибудь вышеуказанный BWG © (17.01.02 14:24)код и намыльтео результатах. Не работает он у меня.
И телнет говорит " 550" когда я mail fromотправляю.
Прочитайте мне, please, manual.

С уважением, Алексей.


paul_shmakov   (2002-01-17 16:37:00) [13]

2 BWG © (17.01.02 16:11)

Что "то же самое"?
подключиться telnet-ом к smtp.narod.ru на 25 порт и ввести вручную все команды (перед этим не забудьте включить Local Echo в Terminal/Preferences).
ваш возможный диалог с сервером я уже приводил чуть выше (paul_shmakov © (17.01.02 13:45)).
если руками все это получиться, то и программно все должно работать.



BWG   (2002-01-17 16:31:00) [14]

Все Яндекс к фене полетел...


paul_shmakov   (2002-01-17 16:22:00) [15]

503 - это уже после. главное здесь 550

550 Requested action not taken: mailbox unavailable
[E.g., mailbox not found, no access]

к сожалению, почему-то у меня сейчас не получается соединиться telnet-ом ни с smtp.narod.ru, ни с smtp.yandex.ru - толи сервера висят, толи файервол у нас не пускает, хотя с smtp.mail.ru все нормально.


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

Что "то же самое"?


Polevi   (2002-01-17 14:31:00) [17]

Ты пробовал тоже самое сделать телнетом ?


BWG   (2002-01-17 14:27:00) [18]

Смена сервера на smtp.yandex.ruне помогла. Хотя он авторизации точно не требует.


BWG   (2002-01-17 14:24:00) [19]

Протестировал так:
program TestMail;
{$APPTYPE CONSOLE}
uses
SysUtils, Winsock, Windows;

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)^)^;
writeln("IP is ",IP);
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 Result then writeln("Connected ok");

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

function SendCommand(Text: string): Boolean;
var
Buffer: PChar;
Size: Integer;
begin
Text := Text + #13#10;
Size := Length(Text);
GetMem(Buffer, Size + 1);
try
StrCopy(Buffer, PChar(Text));
Result := send(S, Buffer^, Size, 0) <> SOCKET_ERROR;
writeln("command > ",text," > result > ",result);
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
begin
writeln("Socket error!");
Exit;
end;

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);
writeln("Resp. result > ",result);
end;

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

begin
writeln("Started");
SendMail("<bwgblackraven@narod.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");
writeln("Sended");
readln;
end.


Получил такой пинок:

220
550
503
503
503
550


По RFC 503- Bad sequence of commands

И что не верно?


paul_shmakov   (2002-01-17 13:57:00) [20]

ну и на любителей более новая версия протокола:
smtp rfc 2821
http://www.ietf.org/rfc/rfc2821.txt?number=2821


Страницы:   1 2

Наверх

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