2009-07-06 5 views
8

Использование D7 + Indy 10 последних построек.Delphi + Indy: Соединение закрыто изящно

Мой код использует TIdSMTP для отправки электронной почты. Я продолжаю получать «Соединение закрыто грациозно» у некоторых конечных пользователей, и письмо никогда не отправляется.

код, как:

try 
~~~~ 
~~~~ 
_idSMTP := TIdSmtp.Create; 
with _idSMTP do 
begin 
    Host := 'myhost'; 
    Connect; 
    try 
    Send(_EmailMsg); 
    Result := True; 
    except 
    on E: Exception do 
    begin 
     MsgDlgErr(Self.Handle, E.Message) 
    end 
    end; 
end; 
finally 
_idSMTP.Disconnect; 
_idSMTP.Free; 
end; 

Любые советы?

ответ

20

Читайте об этом на http://www.swissdelphicenter.ch/en/showarticle.php?id=1

EIdConnClosedGracefully является исключение сигнализации о том, что соединение было закрыто другой стороны преднамеренно. Это не так же, как сломанное соединение, которое вызовет ошибку сброса соединения. Если другая сторона закрыла соединение и прочитана розетка или , написанная на EIdConnClosedGracefully будет поднята Indy. Это похоже на попытку прочитать или написать в файл, который был закрыт без ваших знаний.

В некоторых случаях это настоящее исключение , и ваш код должен обрабатывать его. В в других случаях (обычно это серверы) это является нормальной частью функционирования протокола , и Indy обрабатывает это исключение . Даже если Indy поймает его, при запуске в IDE сначала будет запущен отладчик. Вы можете просто нажать F9, чтобы продолжить , и Indy обработает исключение, , но постоянная остановка во время отладки может быть довольно неприятной. В случаях, когда Indy ловит исключение , ваши пользователи никогда не увидят исключение в вашей программе, если только не запускается из среды IDE.

+0

Исключение не происходит в среде IDE, но на компьютерах конечного пользователя. – Atlas

+0

Некоторые vivusscanners блокируют исходящие соединения на SMTP-порту в настоящее время. Это может привести к тому, что соединение будет не отвечать на запросы и выбросить эту ошибку. –

+2

@Atlas: Вот почему он говорит: «В некоторых случаях ...» :) Страница также рассказывает о других случаях. –

2

В моем случае ошибка была вызвана тем, что я использовал адрес отправителя из другого домена, чем тот, который размещен на сервере smtp, поэтому сервер smtp отклонил соединение.

1

По моему опыту, в случае сервера AT & T он отклоняет адрес электронной почты, который не является адресом @att.net в MAIL FROM. Более подробную информацию можно определить, зарегистрировав ошибку с помощью TIdLogEvent для этих пользователей, которые ее получают, в противном случае отчет об ошибке будет довольно расплывчатым - если отключение (Соединение закрыто изящно) происходит сразу после MAIL FROM, это может указывать на политику сервера, отклоняющую электронное письмо с домен, который он не размещает, как объяснил Тони.

В противном случае «Соединение закрыто корректно» ошибка означает, что предпринимается попытка чтения/записи в сокет, который был закрыт одноранговой намеренно - в вашем случае, равный является сервером SMTP подключения к. Он отличается от ошибки «Сброс соединения», которая указывает на сломанное соединение. В обоих случаях соединение больше не присутствует, и вы больше не можете читать/писать.

Смежные вопросы