2009-07-06 46 views
8

Sử dụng D7 + Indy 10 phiên bản mới nhất.Delphi + Indy: Kết nối được đóng một cách duyên dáng

Mã của tôi đang sử dụng TIdSMTP để gửi email. Tôi tiếp tục nhận được "Kết nối đã đóng một cách duyên dáng" ở một số người dùng cuối và email không bao giờ được gửi.

Mã này cũng giống như:

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; 

Bất cứ lời khuyên?

Trả lời

20

Đọc tất cả về nó trên http://www.swissdelphicenter.ch/en/showarticle.php?id=1

EIdConnClosedGracefully là một ngoại lệ tín hiệu rằng kết nối đã bị đóng cửa bởi các bên kia cố ý. Đây không phải là giống như kết nối bị hỏng mà sẽ gây ra lỗi đặt lại kết nối. Nếu bên kia đã đóng kết nối và ổ cắm được đọc hoặc được ghi vào, EIdConnClosedGracefully sẽ được Indy nâng lên. Đây là tương tự như cố gắng đọc hoặc viết vào một tệp đã bị đóng mà không có kiến ​​thức của bạn.

Trong một số trường hợp, đây là ngoại lệ thực sự và mã của bạn cần xử lý. Trong trường hợp khác (thường là máy chủ) này là một phần bình thường của hoạt động của giao thức và Indy xử lý trường hợp ngoại lệ này cho bạn. Mặc dù Indy bắt được nó, khi chạy trong IDE trình gỡ lỗi sẽ được kích hoạt trước tiên. Bạn chỉ cần nhấn F9 để tiếp tục và Indy sẽ xử lý ngoại lệ, nhưng dừng liên tục trong khi gỡ lỗi có thể khá khó chịu. Trong trường hợp Indy bắt được ngoại lệ , người dùng của bạn sẽ không bao giờ thấy ngoại lệ trong chương trình của bạn trừ khi nó được chạy từ IDE.

+0

Ngoại lệ không xảy ra trong IDE, nhưng trên máy tính người dùng cuối. – Atlas

+0

Một số virusscanners chặn các kết nối gửi đi trên cổng SMTP ngày nay. Điều này có thể khiến kết nối không phản hồi và ném lỗi này. –

+2

@Atlas: Đó là lý do tại sao nó nói "Trong một số trường hợp ..." :) Trang cũng nói về các trường hợp khác. –

2

Trong trường hợp của tôi, lỗi được gây ra bởi vì tôi đã sử dụng địa chỉ email của người gửi từ miền khác với tên miền được lưu trữ bởi máy chủ SMTP, đó là lý do máy chủ SMTP từ chối kết nối.

1

Theo kinh nghiệm của tôi, trong trường hợp AT & máy chủ T, nó từ chối địa chỉ email không phải là địa chỉ @att.net trong số MAIL FROM. Thông tin thêm có thể được xác định bằng cách ghi nhật ký lỗi bằng cách sử dụng TIdLogEvent cho những người dùng nhận nó, nếu không báo cáo lỗi khá mơ hồ - nếu ngắt kết nối (kết nối được đóng kín) xảy ra ngay sau MAIL FROM thì nó có thể cho biết chính sách máy chủ từ chối email tên miền không lưu trữ như được giải thích bởi Toni.

Nếu không, "Kết nối bị đóng duyên dáng" lỗi có nghĩa là một nỗ lực đang được thực hiện để đọc/ghi tới ổ cắm đã bị đóng cửa bởi các peer cố ý - trong trường hợp của bạn, peer là máy chủ SMTP bạn kết nối với. Nó khác với lỗi "Đặt lại kết nối" cho biết kết nối bị hỏng. Trong cả hai trường hợp, kết nối không còn tồn tại nữa và bạn không thể đọc/ghi được nữa.

Các vấn đề liên quan