Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.25;
Скачать: CL | DM;

Вниз

SMTP+ClientSocket   Найти похожие ветки 

 
Дмитрий ©   (2001-12-05 08:59) [0]

Возникла нужда письмо руками собирать и клиента тоже самому писать, так вот:

procedure TSMTPSocket.Connect; //породил от ClientSocket
begin
if Self.Host<>"" then
try
Self.Active:=true;
Self.Analyse(Self.Socket.ReceiveText, "220"); // сервер представился
Self.Socket.SendText("HELO "+Self.Host+#13#10); //и я поздоровался
Self.Analyse(Self.Socket.ReceiveText, "250");
except
on E: Exception do
begin
(* *)
Self.Close;
end;
end;
end;

Self. добавил специяльно - это и есть TSMTPSocket.
В процедуре Analyse возбуждается исключение, если ожидаемый код не совпадает с передаваемым.
Грабли в том, что если по этой конструкции лазать с дебаггером - все на ура, а если RUN - ощущение, что сервер начинает отставать на 1 шаг, рассинхронизация, то бишь. Пачему?


 
Digitman ©   (2001-12-06 09:26) [1]

Ты уверен, что сервер ждет, пока ты "поздороваешься", прежде чем слать тебе очеред.строку ?


 
Polevi ©   (2001-12-06 09:52) [2]

2Digitman ©
Насколько я помню так работает SMTP протокол..


 
Дмитрий ©   (2001-12-06 11:30) [3]

Уточню^
после открытия порта сервер посылает
220 server.ru ESMTP ...
->HELO server.ru
250 server.ru Helo ...

Так вот: при отладке все нормально, а без нее я сначала получаю пустую строку, затем, после HELO получаю ответ 220 (пресловутая задержка)

Тот же самый код на Perl:

use Socket;
use IO::Socket;

$socket = IO::Socket::INET->new(
PeerAddr => "192.168.0.18",
PeerPort => "25",
Proto => "tcp"
) or die $!;

$socket->autoflush();

print $str = <$socket>;
print $socket "helo 192.168.0.18\n";
print $str = <$socket>;

- все нормально.


 
Дмитрий ©   (2001-12-06 12:33) [4]

Всем спасибо, Indy скачал. Работает.


 
Digitman ©   (2001-12-06 12:33) [5]

да сервер просто не успевает еще "представиться", когда ты выполняешь строчку
Self.Analyse(Self.Socket.ReceiveText, "220") !
вот ты и получаешь пустую строку, поскольку от сервера еще ничего не пришло (и идешь дальше !).

метод ReceiveText надо выполнять в обработчике события OnRead, когда в приемном буфере гнезда ДОСТОВЕРНО есть данные, приятые от передающей стороны (SMTP-сервера , в твоем случае). Событие OnRead есть сигнал, по которому ты должен читать то, что тебе передали. И ни в какой другой момент !


 
Дмитрий ©   (2001-12-06 13:27) [6]

Digitman, спасибо. Я уже расковырял TIDTCPClient :)


 
Digitman ©   (2001-12-06 13:45) [7]

думаешь, он надежней работает, чем TClientSocket ?


 
Дмитрий ©   (2001-12-06 13:56) [8]

Winshoes у меня уже почти год стоит. Indy - поновее. И Indy(Winshoes) -компоненты умеют через Socks работать. Я бы с удовольствием TSocketClient "улучшил" - но - есть желание, но нету времени :)


 
Digitman ©   (2001-12-06 14:18) [9]

Не просветишь ли - чем же ты его хочешь "улучшить" ? Чем TclientSocket тебя не устраивает в первозданном виде ? Конкретно.


 
Дмитрий ©   (2001-12-06 15:01) [10]

Тем, что он через Socks не работает.
<Драться с вами не хочу :)>


 
Digitman ©   (2001-12-06 15:18) [11]

а Indy еще чего-то "не умеет" ) Так и будешь метаться, не разобравшись до конца в фукнкциональности того, на что сделал ставку ? Вряд ли у тебя при таком подходе что-то путное выйдет) ... извини уж , но это - мое imho )))


 
Digitman ©   (2001-12-06 15:23) [12]

видишь ли, чем сложнее оболочка одного и того же же WinsockAPI-интерфейса, тем "темнее лес", тем меньше надежность и тем сложнее понимание внутренней логики объекта. Случись чего в финальном релизе твоей задачи - что будешь делать ? "Выкидывать" Indy и "перелопачивать" весь свой код под какой-нибудь очередной Hindy ? Несерьезно это)


 
Дмитрий ©   (2001-12-06 15:31) [13]

>> не разобравшись до конца в фукнкциональности
:)) а где конец ? уяснить строение класса? выучить socket api ? самому перепрошить устройство ввода-вывода (сетевую карту) ?

>> Вряд ли у тебя при таком подходе что-то путное выйдет
Уже вышло. Эта проблема - последняя. Она решена. За помощь - еще раз - спасибо. все мы немного ламеры. и т.д. и. т.п.


 
Digitman ©   (2001-12-06 15:40) [14]

как знаешь)... мое дело - поделиться собственным опытом. Не жалко)


 
Дмитрий ©   (2001-12-06 15:48) [15]

А, ну тогда - можете еще поделиться :))



Страницы: 1 вся ветка

Текущий архив: 2002.02.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
7-79479
Asisyay
2001-10-31 15:35
2002.02.25
Intel 8254


1-79344
Данил
2002-02-05 17:22
2002.02.25
Help: Нужно


6-79413
Kettle of delphi
2001-12-08 17:35
2002.02.25
Помогите с индикатором процесса копирования!


1-79319
petr
2002-02-07 20:13
2002.02.25
TreeView c CheckBox-ами около каждого элемента


7-79486
Di_wind
2001-11-03 14:23
2002.02.25
расшифровка PWL