我工作的产品使用Indy组件发送电子邮件。它是在RAD Studio XE4(C ++)中开发的。我试图找出它为什么在某些计算机上工作但在其他计算机上不工作。当然,它适用于我的开发盒。在测试框中,我得到一个“正常关闭连接”消息或套接字错误10054。
两台机器都加载了相同的Indy文件。我的开发框运行Win 8.1,测试框运行Win 7,因此一些Windows DLL是不同的版本,但我怀疑这是问题。
我写了一个非常简单的测试应用程序,它表现出相同的行为。
我的开发框上的SMTP邮件如下所示:
S: 220 smtp.gmail.com ESMTP vf11sm8649345igb.20 - gsmtp
C: EHLO ks-sayers-v60
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
C: EHLO ks-sayers-v60
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8
我的测试框上的SMTP消息如下所示:
S: 220 smtp.gmail.com ESMTP s19sm631546ign.4 - gsmtp
C: EHLO ks-dsatest-v41
S: 250-smtp.gmail.com at your service, [64.132.205.66]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
C: QUIT
我在两个测试中都使用相同的gmail用户和密码。我不确定为什么我的测试应用程序在测试盒而不是EHLO上发送QUIT消息。
任何帮助或想法应该非常感谢!
RAD Studio XE4
Indy 10.6.0.4975
ssleay32.dll / libeay32.dll是v1.0.0g
测试代码:
void __fastcall TForm1::btnSendClick(TObject *Sender)
{
IdLogFile1->Active = true;
try
{
try
{
IdSMTP1->ConnectTimeout = 30000;
IdSMTP1->Username = edtFrom->Text;
IdSMTP1->Password = edtPassword->Text;
IdMessage1->Recipients->Clear();
IdMessage1->Recipients->Add();
IdMessage1->Recipients->Items[0]->Address = edtTo->Text;
IdSMTP1->Connect();
if (IdSMTP1->Connected())
{
IdSMTP1->Send(IdMessage1);
}
LogSmtpSettings();
}
catch (Exception & e)
{
LogSmtpSettings();
throw Exception(e.Message);
}
}
__finally
{
IdLogFile1->Active = false;
}
}
以下是TIdSMTP组件的属性:
Indy Version: 10.6.0.4975
Host: smtp.gmail.com
Port: 587
HELO Name:
Mail Agent:
IOHandler: TIdSSLIOHandlerSocketOpenSSL
Connection Timeout: 30000
Read Timeout: -1
Authentication Type: Default
Validate Auth Login: True
Username: 's23ayers@gmail.com'
Use EHLO: True
TLS: Explicit TLS
Use Nagle: True
Use Pipelining: True
Use VERP: False
VERP Delimiters: none
Intercept: TIdLogFile
Intercept IsClient: True
Supports TLS: True
Last Command Result: Ready to start TLS
答案 0 :(得分:0)
您的测试框在收到QUIT
成功回复后立即发送STARTTLS
命令的事实意味着TLS握手失败。 TIdSMTP
会先调用Disconnect()
,然后在代码中提出TLS异常,说明握手失败。
此外,您使用的是Indy 10的旧版本。TIdSMTP
已在2014年中期更新,如果TLS握手失败,则不再发送QUIT
。你说你使用的是10.6.0.4975,当前版本(在撰写本文时)是10.6.2.5339。
现在,至于为什么TLS握手失败是有人猜的,因为你还没有提供有关你的设置的任何细节来诊断这个问题。也许您没有为TLS正确配置TIdSMTP
。也许您的应用程序没有安装正确的SSL / TLS DLL。谁知道。请提供这些细节。