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

Вниз

TidSMTP   Найти похожие ветки 

 
axis_of_evil ©   (2009-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 () должен вызываться извне. прав ли я?


 
Сергей М. ©   (2009-07-09 21:30) [1]

Мультипоточность, если она имеет место быть, имеется в серверных компонентах в составе Инди.

Компонент TIdSMTP к серверным компонентам в составе оного пакета отношения не имеет, ибо это компонеyn-"клиент".


 
Anatoly Podgoretsky ©   (2009-07-10 10:30) [2]


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

Вообще то ни так, это вообще редкость в Инди


 
axis_of_evil ©   (2009-07-10 12:27) [3]

хм .. спасибо :>
должно быть, перепутал

вопрос такой: // не могу понять - не из хелпа, не из гугла
вызываем idSMTP1.Send(Message);
как определить - щто письмо успешно доставлено?


 
axis_of_evil ©   (2009-07-10 12:43) [4]

idSMTP1.Connected;
кто бы мог подумать ..


 
axis_of_evil ©   (2009-07-10 12:58) [5]

туплю, это Connect(). думаем дальше %>


 
Сергей М. ©   (2009-07-10 13:01) [6]


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


Доставлено кому ?
Если собственно адресату, то считай что никак.


 
Anatoly Podgoretsky ©   (2009-07-10 13:22) [7]

> Сергей М.  (10.07.2009 13:01:06)  [6]

При том Кому это список.


 
axis_of_evil ©   (2009-07-10 13:28) [8]


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

промежуточному почтовому серверу, который в свойствах idSMTP и прописан. я попросту запутался - вызов Send() блокирует работу, пока не отошлет или же об этом можно узнать по какому-то событию?


 
axis_of_evil ©   (2009-07-10 14:00) [9]

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

250 Requested mail action okay, completed

зачем эти черти полосатые положительынй результат в виде exception выдают .. >%>


 
Сергей М. ©   (2009-07-10 14:18) [10]


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


Какому ? Класс исключения какой ?


 
Anatoly Podgoretsky ©   (2009-07-10 14:31) [11]

Откуда вдруг возникло исключение.


 
axis_of_evil ©   (2009-07-10 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 ©   (2009-07-10 15:31) [13]

// этот код должен попросту при получении hsConnected - т.е. после
//   установления соединения отправить письмо


 
axis_of_evil ©   (2009-07-10 16:10) [14]

остановиться щто-ли на народном варианте %>

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

вопрос к знакомым с Indy - такой код корректен?
// если в try .. except заключить, разумеется


 
Anatoly Podgoretsky ©   (2009-07-10 16:58) [15]

> axis_of_evil  (10.07.2009 16:10:14)  [14]

Корректен, только добавить обработку исключений и сообщений.
При том именно независимо.


 
axis_of_evil ©   (2009-07-11 03:17) [16]


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

т.е. каждый вызов в try..except
щто значит обработка сообщений? -Application.ProcessMessages?


 
Palladin ©   (2009-07-12 18:06) [17]


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

интересная фраза... объясни пожалуйста


 
axis_of_evil ©   (2009-07-13 10:28) [18]

это значит, щто я не понял, щто имел ввиду Анатолий, говоря "обработку исключений и сообщений" - и попытался догадаться :>
// возможно, под сообщениями подразумевались отличные от windows-сообщений сообщения %>


 
Anatoly Podgoretsky ©   (2009-07-13 11:59) [19]

Ничего странного, что не понял.
Не все решается через изсключения, кое что через возвращаемые сообщения, кое что через коды возврата. Исключения это редкая вещь при работе с Сетью и исключения это не ошибка.


 
GazooM   (2009-12-11 10:20) [20]

Напиши вот так и все у тебя будет суппер!
Try
  idSMTP1.Send(IdMessage1);
Except
      if GetLastError=0 then ShowMEssage(" Письмо успешно отправлено ""+IdMessage1.Recipients.EMailAddresses+""")
      else ShowMEssage("Возникла ошибка при отправке письма: ("+ inttostr(GetLastError) +") "+ SysErrorMessage(GetLastError));
end;


 
Сергей М. ©   (2009-12-11 10:41) [21]


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


Никакого "суппера" не будет.
Грабли вместо него будут.


 
foxm66 ©   (2009-12-11 15:37) [22]

Такой вопрос. Мне надо отправить несколько писем со вложениями.
И вот я создал нужные вложения:
TIdAttachment.Create(idMessage1.MessageParts, FileName);
TIdAttachment.Create(idMessage1.MessageParts, FileName);
...
TIdAttachment.Create(idMessage1.MessageParts, FileName);
отправил. Все в порядке.
НО теперь мне надо отправить следующее письмо, где число вложений меньше. Как корректно удалить лишние вложения? Подскажите, пожалуйста.


 
Сергей М. ©   (2009-12-11 16:46) [23]

Пройтись в for..downto - цикле по списку idMessage1.MessageParts, проверяя каждый элемент на принадлежность типу  TIdAttachment. В случае принадлежности проанализировать нужно ли оно, и если не нужно - удалить из списка.


 
foxm66 ©   (2009-12-15 07:57) [24]

Сергей М - Спасибо! Получилось!


 
foxm66 ©   (2009-12-18 08:14) [25]

Новая проблема. Если имя файла вложения содержит русские буквы, то возникает проблема. Причем я пробовал на BATe, он понимает нормально, но у клиентов Outlook и русские буквы там отражаются крякозябрами. Русская кодировка там не устанавливается, несмотря на явное ее задание в свойствах.
Как можно это поправить? Delphi6 Indy 8


 
Anatoly Podgoretsky ©   (2009-12-18 09:02) [26]

Никаких проблем с русскими буквами не возникает, если они составлены в соответствии с MIME - =?codepage?pack?filename?=

А Инди очень старый, вряд ли кто его еще помнит.


 
foxm66 ©   (2009-12-18 10:32) [27]

Вот вопрос в том и состоит, как заставить Indy правильно составлять имена.
И надеюсь на людей с хорошей памятью. ;)


 
Сергей М. ©   (2009-12-18 14:25) [28]


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


Что мешает обновиться хотя бы до 9-ки, а еще лучше до 10-ки ?


 
foxm66 ©   (2009-12-21 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?), а гарантии работы, получается, нет?



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

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

Наверх




Память: 0.54 MB
Время: 0.056 c
6-1265872619
Den
2010-02-11 10:16
2013.03.22
No route to host


15-1350554228
ProgRAMmer Dimonych
2012-10-18 13:57
2013.03.22
Помогите с SQL-запросом


15-1351711327
Дмитрий С
2012-10-31 23:22
2013.03.22
Логи


2-1337876849
Тарас
2012-05-24 20:27
2013.03.22
Веб Браузер


2-1340221150
leonidus
2012-06-20 23:39
2013.03.22
Странное поведение потока