【问题标题】:Gmail failing with 'Connection Closed Gracefully' using Indy in Delphi XE on Windows 8Gmail 在 Windows 8 上的 Delphi XE 中使用 Indy 时“正常关闭连接”失败
【发布时间】:2014-04-26 09:33:20
【问题描述】:

数百个 Windows 8 客户端中大约有 2-3 个在 2-3 周前开始收到此消息。

每个 Wireshark 在连接关闭之前的最后一次传输是

'2.0.0 准备启动 TLS'

代码sn-p:

Smtp := TIdSMTP.Create(nil);
try
  IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
  try
    Smtp.OnStatus := IdSMTP1Status;
    Smtp.OnWorkBegin := IdSMTP1WorkBegin;
    Smtp.OnWorkEnd := IdSMTP1WorkEnd;
    Smtp.OnWork := IdSMTPWork;
    Smtp.Host := 'smtp.gmail.com'
    Smtp.Port := 487, 565 both tried here;
    Smtp.Username := 'the email@gmail.com'
    Smtp.Password := 'The password'
    // TLS for Gmail, etc
    if UseSSL then // true 
    begin
      Smtp.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      if Smtp.Port = 465 then
        Smtp.UseTLS := utUseImplicitTLS
      else
      if Smtp.Port = 587 then
        Smtp.UseTLS := utUseExplicitTLS
      else
        Smtp.UseTLS := utUseExplicitTLS;
      IdSSLIOHandlerSocketOpenSSL1.Host := 'gmail smtp again'

      IdSSLIOHandlerSocketOpenSSL1.Destination :=
        Smtp.Host + ':' + IntToStr(Smtp.Port);
      IdSSLIOHandlerSocketOpenSSL1.Port := Smtp.Port;
    end;
    try
     Smtp.Connect;
     sTempFileName := data1.GetSettingsFileFolder+'\tmp.email';
     EmailMessage.SaveToFile(sTempFileName);
     AssignFile(F,sTempFileName);
     Reset(F);
     iFileSize := FileSize(F) * 128;
     CloseFile(F);
     SysUtils.DeleteFile(sTempFileName);
     StatusForm.SetProgress(0,iFileSize);
     Smtp.Send(EmailMessage);
    except on E:Exception do
      begin
        MessageDlg(E.Message, mtError, [mbOK], 0);
        Exit;
      end;
    end;
  finally
    IdSSLIOHandlerSocketOpenSSL1.Free;
  end;
finally
  EmailMessage.MessageParts.Clear;
  if Smtp.Connected then smtp.Disconnect;
  Smtp.Free;
end;

【问题讨论】:

    标签: delphi gmail delphi-xe indy


    【解决方案1】:

    2.0.0 Ready to start TLS 用于回复STARTTLS 命令。如果您之后立即断开连接,则 TLS 握手可能会失败,您应该会收到一个解释失败原因的异常。仔细检查您的 TLS 设置。另请注意,设置UseTLS 属性可能会更改Port 属性,因此最好在设置Port 之前设置UseTLS,而不是相反。

    另外,您不需要设置 IOHandler 的 HostPortDestination 属性。 Connect() 将为您处理。

    【讨论】:

    • 我确保 UseTLS 在端口之前 - 仔细检查了 TLS 设置。仍然失败。始终在 Windows 8 上。
    • 就像我说的,它必须是一个 TLS 握手错误,你应该得到一个这样的异常。真的是这样吗? Wireshark 在握手期间是否显示任何 TLS 错误?默认情况下,Wireshark 不会解密 TLS 加密的数据,但它会解密未加密的握手本身。
    • 我得到的唯一错误是“连接正常关闭”。没有例外。我没有发现握手有任何问题。
    • 你所描述的毫无意义。您最初声明 last 传输是 STARTTLS 回复,这意味着没有执行握手。现在您说执行了握手,在这种情况下,您不应该在握手过程中收到“正常关闭”错误,它要么成功,要么不成功。只有在握手开始之前或握手完成之后,“正常关闭”错误才会更有意义。如果没有看到实际的 Wireshark 捕获和导致异常的调用堆栈,这很难诊断。
    • 星期一我会给你买 Wireshark。对不起,没有意义。
    猜你喜欢
    • 2010-11-08
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2012-02-19
    • 2022-01-21
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多