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

Вниз

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

Наверх




Память: 0.53 MB
Время: 0.061 c
15-1349681511
Jeer
2012-10-08 11:31
2013.03.22
Отечественные микропроцессоры


15-1352825506
>|<
2012-11-13 20:51
2013.03.22
Определение границ максимальной плотности точек


15-1345632073
Rouse_
2012-08-22 14:41
2013.03.22
Семинар "RAD Studio XE3"


15-1337705050
Фокс Йожин
2012-05-22 20:44
2013.03.22
Ужасы тоталитарного режима


15-1351850650
AV
2012-11-02 14:04
2013.03.22
Нейронные сети распознавания изображения. Для идиотов :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский