-
вопрос первый - правильно ли я понимаю принцип работы Indy?
насколько я знаю, Indy Sockets - многопоточные.
т.е. при вызове
idSMTP1.Connect;
idSMTP1 начнет в отдельном потоке свою работу по соединению, программа (основной поток) продолжит работу.
вопрос второй - как, собственно, правильно этим компонентом пользоваться?
// в Demos почти ничего нет
пусть был вызван метод Connect()
далее поток idSMTP1 передал управление в обработчик IndySMTPStatus(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
и статус говорит о том, щто мы connected
как следует поступить далее? - мне кажется, щто некорректно вызывать из IndySMTPStatus() другой метод - скажем, Send().
тогда получается, щто нужно сигналить основному потоку о своей готовности, или, выражаясь более общими словами, - метод Send () должен вызываться извне. прав ли я?
-
Мультипоточность, если она имеет место быть, имеется в серверных компонентах в составе Инди.
Компонент TIdSMTP к серверным компонентам в составе оного пакета отношения не имеет, ибо это компонеyn-"клиент".
-
> насколько я знаю, Indy Sockets - многопоточные.
Вообще то ни так, это вообще редкость в Инди
-
хм .. спасибо :>
должно быть, перепутал
вопрос такой: // не могу понять - не из хелпа, не из гугла
вызываем idSMTP1.Send(Message);
как определить - щто письмо успешно доставлено?
-
idSMTP1.Connected;
кто бы мог подумать ..
-
туплю, это Connect(). думаем дальше %>
-
> как определить - щто письмо успешно доставлено
Доставлено кому ?
Если собственно адресату, то считай что никак.
-
> Сергей М. (10.07.2009 13:01:06) [6]
При том Кому это список.
-
> Доставлено кому ?
промежуточному почтовому серверу, который в свойствах idSMTP и прописан. я попросту запутался - вызов Send() блокирует работу, пока не отошлет или же об этом можно узнать по какому-то событию?
-
вызов send() приоводит к исключению ..
250 Requested mail action okay, completed
зачем эти черти полосатые положительынй результат в виде exception выдают .. >%>
-
> вызов send() приоводит к исключению
Какому ? Класс исключения какой ?
-
Откуда вдруг возникло исключение.
-
прошу прощения, забываю полную информацию выдать.
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;
end;
end;
...
при вызове Send - генерируется вышеописанное исключение и IdSMTP засыпает. при закомментированном Send'е, т.е. вызове Disconnect из этого обработчика - генерируется EIdSMTPReplyError с Message, присланным локальным почтовым сервером
// к сожалению, название локального почтовика - единственное, щто в сообщении этого исключения можно понять
thinking .. %>
-
// этот код должен попросту при получении hsConnected - т.е. после
// установления соединения отправить письмо
-
остановиться щто-ли на народном варианте %>
idsmtp1.Connect;
idsmtp1.Send(idmessage1);
idsmtp1.Disconnect;
вопрос к знакомым с Indy - такой код корректен?
// если в try .. except заключить, разумеется
-
> axis_of_evil (10.07.2009 16:10:14) [14]
Корректен, только добавить обработку исключений и сообщений.
При том именно независимо.
-
> обработку исключений и сообщений.
т.е. каждый вызов в try..except
щто значит обработка сообщений? -Application.ProcessMessages?
-
> щто значит обработка сообщений? -Application.ProcessMessages?
интересная фраза... объясни пожалуйста
-
это значит, щто я не понял, щто имел ввиду Анатолий, говоря "обработку исключений и сообщений" - и попытался догадаться :>
// возможно, под сообщениями подразумевались отличные от windows-сообщений сообщения %>
-
Ничего странного, что не понял.
Не все решается через изсключения, кое что через возвращаемые сообщения, кое что через коды возврата. Исключения это редкая вещь при работе с Сетью и исключения это не ошибка.
-
Напиши вот так и все у тебя будет суппер!
Try
idSMTP1.Send(IdMessage1);
Except
if GetLastError=0 then ShowMEssage(' Письмо успешно отправлено "'+IdMessage1.Recipients.EMailAddresses+'"')
else ShowMEssage('Возникла ошибка при отправке письма: ('+ inttostr(GetLastError) +') '+ SysErrorMessage(GetLastError));
end;
-
> Напиши вот так и все у тебя будет суппер
Никакого "суппера" не будет.
Грабли вместо него будут.
-
Такой вопрос. Мне надо отправить несколько писем со вложениями.
И вот я создал нужные вложения:
TIdAttachment.Create(idMessage1.MessageParts, FileName);
TIdAttachment.Create(idMessage1.MessageParts, FileName);
...
TIdAttachment.Create(idMessage1.MessageParts, FileName);
отправил. Все в порядке.
НО теперь мне надо отправить следующее письмо, где число вложений меньше. Как корректно удалить лишние вложения? Подскажите, пожалуйста.
-
Пройтись в for..downto - цикле по списку idMessage1.MessageParts, проверяя каждый элемент на принадлежность типу TIdAttachment. В случае принадлежности проанализировать нужно ли оно, и если не нужно - удалить из списка.
-
Сергей М - Спасибо! Получилось!
-
Новая проблема. Если имя файла вложения содержит русские буквы, то возникает проблема. Причем я пробовал на BATe, он понимает нормально, но у клиентов Outlook и русские буквы там отражаются крякозябрами. Русская кодировка там не устанавливается, несмотря на явное ее задание в свойствах.
Как можно это поправить? Delphi6 Indy 8
-
Никаких проблем с русскими буквами не возникает, если они составлены в соответствии с MIME - =?codepage?pack?filename?=
А Инди очень старый, вряд ли кто его еще помнит.
-
Вот вопрос в том и состоит, как заставить Indy правильно составлять имена.
И надеюсь на людей с хорошей памятью. ;)
-
> foxm66 © (18.12.09 10:32) [27]
Что мешает обновиться хотя бы до 9-ки, а еще лучше до 10-ки ?
-
>Сергей М.
А Вы уверены, что это решит проблему?
На другом форуме я нашел вот такое обсуждение:
От: vpavel
Дата: 05.03.07 08:23
Здравствуйте
При аттачменте в кодировке koi8-r название файла приходит в аброкозябрах.
Просмотрел форум, эта тема уже подымалась, но ответа не нашел.
Использую компонент IdSmtp Indy9 Delphi
От: Vodyamba
Дата: 06.03.07 03:58
Да уж... Ответ и я в своё время так и не нашел... На Indy 10... пришлось прикреплять аттачменты только с английским наименованием...
ТоО есть, мне надо найти 10-ю Indy, установить (а она встанет на Delphi 6?), а гарантии работы, получается, нет?