首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows 8环境下使用Delphi中Indy的Gmail失败与“连接优雅关闭”

在Windows 8环境下使用Delphi中Indy的Gmail失败与“连接优雅关闭”
EN

Stack Overflow用户
提问于 2014-03-19 20:47:23
回答 1查看 7.5K关注 0票数 2

大约有2-3个Windows 8客户端在2-3周前就开始收到这条消息了。

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

'2.0.0准备启动TLS'

代码片段:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 03:51:21

发送2.0.0 Ready to start TLS是为了响应STARTTLS命令。如果您之后立即断开连接,那么TLS握手很可能失败,您应该得到一个解释失败原因的异常。检查你的TLS设置。还请记住,设置UseTLS属性可能会更改Port属性,因此最好在设置Port之前设置UseTLS,而不是相反。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22517724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档