Конференция "Сети" » TidSMTP [WinXP]
 
  • axis_of_evil © (09.07.09 20:31) [0]
    вопрос первый - правильно ли я понимаю принцип работы Indy?
    насколько я знаю, Indy Sockets - многопоточные.
    т.е. при вызове
     idSMTP1.Connect;
    idSMTP1 начнет в отдельном потоке свою работу по соединению, программа (основной поток) продолжит работу.

    вопрос второй - как, собственно, правильно этим компонентом пользоваться?
    // в Demos почти ничего нет
    пусть был вызван метод Connect()
    далее поток idSMTP1 передал управление в обработчик IndySMTPStatus(ASender: TObject; const AStatus: TIdStatus;
     const AStatusText: string);
    и статус говорит о том, щто мы connected
    как следует поступить далее? - мне кажется, щто некорректно вызывать из IndySMTPStatus() другой метод - скажем, Send().
    тогда получается, щто нужно сигналить основному потоку о своей готовности, или, выражаясь более общими словами, - метод Send () должен вызываться извне. прав ли я?
  • Сергей М. © (09.07.09 21:30) [1]
    Мультипоточность, если она имеет место быть, имеется в серверных компонентах в составе Инди.

    Компонент TIdSMTP к серверным компонентам в составе оного пакета отношения не имеет, ибо это компонеyn-"клиент".
  • Anatoly Podgoretsky © (10.07.09 10:30) [2]

    > насколько я знаю, Indy Sockets - многопоточные.

    Вообще то ни так, это вообще редкость в Инди
  • axis_of_evil © (10.07.09 12:27) [3]
    хм .. спасибо :>
    должно быть, перепутал

    вопрос такой: // не могу понять - не из хелпа, не из гугла
    вызываем idSMTP1.Send(Message);
    как определить - щто письмо успешно доставлено?
  • axis_of_evil © (10.07.09 12:43) [4]
    idSMTP1.Connected;
    кто бы мог подумать ..
  • axis_of_evil © (10.07.09 12:58) [5]
    туплю, это Connect(). думаем дальше %>
  • Сергей М. © (10.07.09 13:01) [6]

    > как определить - щто письмо успешно доставлено


    Доставлено кому ?
    Если собственно адресату, то считай что никак.
  • Anatoly Podgoretsky © (10.07.09 13:22) [7]
    > Сергей М.  (10.07.2009 13:01:06)  [6]

    При том Кому это список.
  • axis_of_evil © (10.07.09 13:28) [8]

    > Доставлено кому ?

    промежуточному почтовому серверу, который в свойствах idSMTP и прописан. я попросту запутался - вызов Send() блокирует работу, пока не отошлет или же об этом можно узнать по какому-то событию?
  • axis_of_evil © (10.07.09 14:00) [9]
    вызов send() приоводит к исключению ..

    250 Requested mail action okay, completed

    зачем эти черти полосатые положительынй результат в виде exception выдают .. >%>
  • Сергей М. © (10.07.09 14:18) [10]

    > вызов send() приоводит к исключению


    Какому ? Класс исключения какой ?
  • Anatoly Podgoretsky © (10.07.09 14:31) [11]
    Откуда вдруг возникло исключение.
  • axis_of_evil © (10.07.09 15:25) [12]
    прошу прощения, забываю полную информацию выдать.

    EIdSMTPReplyError with message 'Recipient <svanpilov@inbox.ru> ok (remote) '
    ErrorCode у него = 250
    почему-то в коде Indy ответ с таким кодом считается за ошибку
    // пошурщал исходники
    хотя, насколько, я понял (см выше) - это хороший ответ

    пока не понимаю, почему попав сюда со статусом hsConnected, IdSMTP - засыпает на некоторое время. буду дальше копаться в исходниках ..

    procedure TfrmMain.IndySMTPStatus(ASender: TObject; const AStatus: TIdStatus;
     const AStatusText: string);
    var
     Sent: Boolean;
    begin
     case AStatus of
       hsConnected:
         begin
           WriteLog('SMTP status = connected; StatusText = ' + AStatusText);
           Sent := True;
           try
             with FMailList do
               WriteLog(Format('Sending mail %d of %d to address - %s', [Position+1, Count, CurrentMail]));
             IndySMTP.Send(FMailMessage);
           except
             on E: EIdSMTPReplyError do
             if not (E.ErrorCode in [250]) then
             begin
               WriteLog(Format('SMTP eror occured. code: %d', [E.ErrorCode]));
               IndySMTP.Disconnect;
             end;
             on E: Exception do
             begin
               Sent := False;
               IndySMTP.Disconnect;
             end;
           end;
           if Sent then
           begin
             WriteLog('Sending e-mail done');
             IndySMTP.Disconnect;// LaunchTimer;
           end;
         end;
    ...



    при вызове Send - генерируется вышеописанное исключение и IdSMTP засыпает. при закомментированном Send'е, т.е. вызове Disconnect из этого обработчика - генерируется EIdSMTPReplyError с Message, присланным локальным почтовым сервером
    // к сожалению, название локального почтовика - единственное, щто в сообщении этого исключения можно понять

    thinking .. %>
  • axis_of_evil © (10.07.09 15:31) [13]
    // этот код должен попросту при получении hsConnected - т.е. после
    //   установления соединения отправить письмо
  • axis_of_evil © (10.07.09 16:10) [14]
    остановиться щто-ли на народном варианте %>

    idsmtp1.Connect;
    idsmtp1.Send(idmessage1);
    idsmtp1.Disconnect;

    вопрос к знакомым с Indy - такой код корректен?
    // если в try .. except заключить, разумеется
  • Anatoly Podgoretsky © (10.07.09 16:58) [15]
    > axis_of_evil  (10.07.2009 16:10:14)  [14]

    Корректен, только добавить обработку исключений и сообщений.
    При том именно независимо.
  • axis_of_evil © (11.07.09 03:17) [16]

    > обработку исключений и сообщений.

    т.е. каждый вызов в try..except
    щто значит обработка сообщений? -Application.ProcessMessages?
  • Palladin © (12.07.09 18:06) [17]

    > щто значит обработка сообщений? -Application.ProcessMessages?

    интересная фраза... объясни пожалуйста
  • axis_of_evil © (13.07.09 10:28) [18]
    это значит, щто я не понял, щто имел ввиду Анатолий, говоря "обработку исключений и сообщений" - и попытался догадаться :>
    // возможно, под сообщениями подразумевались отличные от windows-сообщений сообщения %>
  • Anatoly Podgoretsky © (13.07.09 11:59) [19]
    Ничего странного, что не понял.
    Не все решается через изсключения, кое что через возвращаемые сообщения, кое что через коды возврата. Исключения это редкая вещь при работе с Сетью и исключения это не ошибка.
 
Конференция "Сети" » TidSMTP [WinXP]
Есть новые Нет новых   [134438   +31][b:0][p:0.003]