使用Indy组件,我得到“连接正常关闭”错误,但只在某些计算机上

时间:2016-02-10 03:02:55

标签: c++ smtp gmail indy

我工作的产品使用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

1 个答案:

答案 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。谁知道。请提供这些细节。