Почему происходит сбой IdSMTP.Send, если указан только один адрес электронной почты?
Я использую Indy и Delphi для отправки сообщений электронной почты. У меня не было проблем, пока одного из пользователей недавно не отпустили. Их учетная запись электронной почты была удалена, и моя программа пыталась отправить по электронной почте около семи пользователей, включая "уменьшенного" пользователя. Я ожидал, что SMTP-сервер примет электронную почту и доставит сообщение действительным пользователям, а затем отправит электронное письмо отправителю, информируя его о том, что одна учетная запись в списке получателей больше не действительна.
Вместо этого SMTP-сервер ничего не принимал, и никто не получил сообщение. Я получил "Почтовый ящик недоступен" в моем журнале. Есть ли настройка, чтобы изменить это поведение на моем конце? Почтовые клиенты, такие как Outlook, конечно, не ведут себя таким образом.
В частности, каков правильный метод отправки сообщений, чтобы все действительные адреса электронной почты в списках получателей получали доставку, а SMTP-сервер уведомлял отправителя о любых неправильных адресах?
Заранее спасибо.
1 ответ
Если вы используете Indy 10, вам нужно назначить обработчик TIdSMTP.OnFailedRecipient
событие и установить VContinue
параметр в True.
procedure TForm1.IdSMTP1FailedRecipient(Sender: TObject; const AAddress, ACode,
AText: string; var VContinue: Boolean);
begin
// do something...
VContinue := True;
end;
Что позволит TIdSMTP
пропустить неудачного получателя и продолжать отправлять электронную почту оставшимся получателям. Только если все получатели потерпят неудачу, TIdSMTP
затем откажитесь от отправки (если, конечно, не произойдет какая-либо другая ошибка, не связанная с получателем).
Если вы используете Indy 9 или более раннюю версию или не предоставляете OnFailedRecipient
обработчик, TIdSMTP
потерпит неудачу и прервет отправку при первой обнаруженной ошибке, включая ошибку получателя.
SMTP-сервер НЕ отправляет уведомление в почтовый ящик отправителя, если он активно отклоняет заданного получателя, пока сообщение электронной почты еще отправляется серверу отправителем. Вам придется использовать OnFailedRecipient
событие, чтобы действовать на этого получателя. Только получатели, которые были приняты сервером, а затем обнаружены ошибки, будут отправлять уведомления в почтовый ящик отправителя соответственно. Это просто, как работает SMTP.