• 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]
    Ничего странного, что не понял.
    Не все решается через изсключения, кое что через возвращаемые сообщения, кое что через коды возврата. Исключения это редкая вещь при работе с Сетью и исключения это не ошибка.
  • GazooM (11.12.09 10:20) [20]
    Напиши вот так и все у тебя будет суппер!
    Try
      idSMTP1.Send(IdMessage1);
    Except
          if GetLastError=0 then ShowMEssage(' Письмо успешно отправлено "'+IdMessage1.Recipients.EMailAddresses+'"')
          else ShowMEssage('Возникла ошибка при отправке письма: ('+ inttostr(GetLastError) +') '+ SysErrorMessage(GetLastError));
    end;
  • Сергей М. © (11.12.09 10:41) [21]

    > Напиши вот так и все у тебя будет суппер


    Никакого "суппера" не будет.
    Грабли вместо него будут.
  • foxm66 © (11.12.09 15:37) [22]
    Такой вопрос. Мне надо отправить несколько писем со вложениями.
    И вот я создал нужные вложения:
    TIdAttachment.Create(idMessage1.MessageParts, FileName);
    TIdAttachment.Create(idMessage1.MessageParts, FileName);
    ...
    TIdAttachment.Create(idMessage1.MessageParts, FileName);
    отправил. Все в порядке.
    НО теперь мне надо отправить следующее письмо, где число вложений меньше. Как корректно удалить лишние вложения? Подскажите, пожалуйста.
  • Сергей М. © (11.12.09 16:46) [23]
    Пройтись в for..downto - цикле по списку idMessage1.MessageParts, проверяя каждый элемент на принадлежность типу  TIdAttachment. В случае принадлежности проанализировать нужно ли оно, и если не нужно - удалить из списка.
  • foxm66 © (15.12.09 07:57) [24]
    Сергей М - Спасибо! Получилось!
  • foxm66 © (18.12.09 08:14) [25]
    Новая проблема. Если имя файла вложения содержит русские буквы, то возникает проблема. Причем я пробовал на BATe, он понимает нормально, но у клиентов Outlook и русские буквы там отражаются крякозябрами. Русская кодировка там не устанавливается, несмотря на явное ее задание в свойствах.
    Как можно это поправить? Delphi6 Indy 8
  • Anatoly Podgoretsky © (18.12.09 09:02) [26]
    Никаких проблем с русскими буквами не возникает, если они составлены в соответствии с MIME - =?codepage?pack?filename?=

    А Инди очень старый, вряд ли кто его еще помнит.
  • foxm66 © (18.12.09 10:32) [27]
    Вот вопрос в том и состоит, как заставить Indy правильно составлять имена.
    И надеюсь на людей с хорошей памятью. ;)
  • Сергей М. © (18.12.09 14:25) [28]

    > foxm66 ©   (18.12.09 10:32) [27]


    Что мешает обновиться хотя бы до 9-ки, а еще лучше до 10-ки ?
  • foxm66 © (21.12.09 08:51) [29]
    >Сергей М.
    А Вы уверены, что это решит проблему?
    На другом форуме я нашел вот такое обсуждение:

    От:  vpavel  
    Дата:  05.03.07 08:23
    Здравствуйте
    При аттачменте в кодировке koi8-r название файла приходит в аброкозябрах.
    Просмотрел форум, эта тема уже подымалась, но ответа не нашел.

    Использую компонент IdSmtp Indy9 Delphi

    От:  Vodyamba  
    Дата:  06.03.07 03:58
    Да уж... Ответ и я в своё время так и не нашел... На Indy 10... пришлось прикреплять аттачменты только с английским наименованием...

    ТоО есть, мне надо найти 10-ю Indy, установить (а она встанет на Delphi 6?), а гарантии работы, получается, нет?
Есть новые Нет новых   [134438   +31][b:0][p:0.002]