使用 Indy 组件时,出现 "connection closed gracefully" 错误,但仅在某些计算机上出现
Using the Indy components, I get "connection closed gracefully" errors, but only on some computers
我开发的一个产品使用 Indy 组件发送电子邮件。它是在 RAD Studio XE4 (C++) 中开发的。我试图找出为什么它在某些计算机上有效但在其他计算机上无效。当然,它适用于我的开发箱。在测试盒上,我收到 "connection closed gracefully" 消息或套接字错误 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 用户和密码。我不确定为什么我的测试应用程序在测试盒上发送 QUIT 消息而不是 EHLO。
任何帮助或想法将不胜感激!
RAD Studio XE4
印地 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
您的测试盒在收到 STARTTLS
成功回复后立即发送 QUIT
命令这一事实意味着 TLS 握手失败。 TIdSMTP
调用 Disconnect()
自身,然后在您的代码中引发 TLS 异常,说明握手失败。
此外,您使用的是旧版本的 Indy 10。TIdSMTP
已于 2014 年年中更新,如果 TLS 握手失败,则不再发送 QUIT
。您说您使用的是 10.6.0.4975,当前版本(在撰写本文时)是 10.6.2.5339。
现在,至于 TLS 握手失败的原因是任何人的猜测,因为您没有提供有关您的设置的任何详细信息来诊断该问题。也许您没有为 TLS 正确配置 TIdSMTP
。也许您的应用程序没有安装正确的 SSL/TLS DLL。谁知道。请提供这些详细信息。
我开发的一个产品使用 Indy 组件发送电子邮件。它是在 RAD Studio XE4 (C++) 中开发的。我试图找出为什么它在某些计算机上有效但在其他计算机上无效。当然,它适用于我的开发箱。在测试盒上,我收到 "connection closed gracefully" 消息或套接字错误 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 用户和密码。我不确定为什么我的测试应用程序在测试盒上发送 QUIT 消息而不是 EHLO。
任何帮助或想法将不胜感激!
RAD Studio XE4
印地 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
您的测试盒在收到 STARTTLS
成功回复后立即发送 QUIT
命令这一事实意味着 TLS 握手失败。 TIdSMTP
调用 Disconnect()
自身,然后在您的代码中引发 TLS 异常,说明握手失败。
此外,您使用的是旧版本的 Indy 10。TIdSMTP
已于 2014 年年中更新,如果 TLS 握手失败,则不再发送 QUIT
。您说您使用的是 10.6.0.4975,当前版本(在撰写本文时)是 10.6.2.5339。
现在,至于 TLS 握手失败的原因是任何人的猜测,因为您没有提供有关您的设置的任何详细信息来诊断该问题。也许您没有为 TLS 正确配置 TIdSMTP
。也许您的应用程序没有安装正确的 SSL/TLS DLL。谁知道。请提供这些详细信息。