Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
1-79394
Lexan
2002-02-05 18:59
2002.02.25
Вопрос про поиск папок


3-79267
Akhmadey
2002-01-30 17:04
2002.02.25
Новый компонент


4-79502
ZEE
2001-12-26 13:30
2002.02.25
Иконка в API-приложении


7-79484
MJH
2001-11-13 16:49
2002.02.25
AverTV - TV + пульт ДУ


4-79505
BDRON
2001-12-25 17:31
2002.02.25
Message





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский