You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C++Builder 11.3 Indy组件发送Gmail邮件认证失败求助

在C++Builder 11.3 RAD Server中用Indy发送Gmail邮件遇"Username and Password not accepted"错误排查

问题描述

我在CBuilder 11.3的RAD Server项目中,使用Indy组件发送Gmail邮件。为测试编写了64位代码,参考了Remy在Stack Overflow上针对Delphi 11“SSL negotiation failed”问题的解决方案,仅做了C适配调整,但运行时出现“Username and Password not accepted”错误,附带提示指向Google账号凭证问题的链接。我怀疑问题与SSL/TLS版本有关,同时希望排查代码问题。另外,若确为SSL/TLS问题,恳请告知适配64位Windows/Windows Server 2019的正确SSL包版本获取途径。我已尝试通过设计时组件配置及更换多个SSL二进制包,均未解决问题。

测试代码

void __fastcall TMainForm::SendBtnClick(TObject *Sender)
{
    try
    {
        // Point to SSL
        IdOpenSSLSetLibPath(L"C:\\openssl");

        // Set up SMTP
        TIdSMTP *IdSMTP = new TIdSMTP(NULL);
        IdSMTP->Host = "smtp.gmail.com";
        IdSMTP->Port = 587;
        IdSMTP->Username = "myEmailAddress@our-domain.com";
        IdSMTP->Password = "my_password_phrase";
        IdSMTP->AuthType = satDefault;

        // Set up SSL/TLS
        TIdSSLIOHandlerSocketOpenSSL *IdSSL = new TIdSSLIOHandlerSocketOpenSSL(IdSMTP);
        IdSSL->SSLOptions->SSLVersions << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;
        IdSSL->SSLOptions->Mode = sslmUnassigned;
        IdSSL->SSLOptions->VerifyMode = TIdSSLVerifyModeSet();
        IdSSL->SSLOptions->VerifyDepth = 0;
        IdSMTP->IOHandler = IdSSL;

        // Had to move the IdSMTP TLS property below the IOHandler as
        // it appears that in C++ you should have your IOHandler set
        // up before setting the IdSMPT property, or you will get,
        // "SSL IOHandler is required for this setting" exception.

        IdSMTP->UseTLS = utUseExplicitTLS;

        // Set up Message
        TIdMessage *IdMessage = new TIdMessage(NULL);
        IdMessage->From->Address = "myEmailAddress@our-domain.com";
        IdMessage->Recipients->Add()->Address = "myOtherEmail@gmail.com";
        IdMessage->Subject = "Test Email";
        IdMessage->Body->Text = "Super Cool Test...";


        try {
            IdSMTP->Connect();
            IdSMTP->Send(IdMessage);
            IdSMTP->Disconnect();
        } catch (const Exception &e) {
            ErrorMemo->Lines->Add("[Connect Exception]: " + e.Message);
        }

        // Tidy up
        delete IdSMTP;
        delete IdSSL;
        delete IdMessage;

        ErrorMemo->Lines->Add("No leaks");
    }
    catch (const Exception &exception)
    {
        ErrorMemo->Lines->Add("[Method Exception]: " + exception.Message);
    }
}

排查与解决方案建议

一、优先处理Google账号凭证问题

这个错误核心是Google拒绝账号验证,和SSL/TLS关联度较低,先确认以下几点:

  • 若账号开启了两步验证,必须使用应用专用密码,不能直接用原账号密码。
  • 未开启两步验证的账号,需在Google账号安全设置中启用不太安全的应用访问(建议优先用应用专用密码方案)。
  • 检查账号是否开启了SMTP服务权限,在Google账号“安全性”板块确认。

二、代码问题修正

  • SSL/TLS版本适配:Gmail仅支持TLS 1.2及以上版本,代码中保留低版本协议会引发兼容性问题,修改为:
    IdSSL->SSLOptions->SSLVersions << sslvTLSv1_2 << sslvTLSv1_3;
    
  • 内存泄漏修复:IdSSL已关联到IdSMTP的IOHandler,IdSMTP销毁时会自动释放该IOHandler,需删除单独的delete IdSSL;语句,避免重复释放。
  • AuthType优化:可显式设置AuthType = satSASL,让Indy自动协商最优的认证机制,提升兼容性。

三、64位Windows适配的OpenSSL包获取

  • 必须使用与Indy版本匹配的64位OpenSSL二进制包,版本不低于1.1.1(支持TLS 1.3)。
  • 下载对应版本的libcrypto-1_1-x64.dll和libssl-1_1-x64.dll(或旧版的libeay32.dll、ssleay32.dll,取决于Indy版本),放置在程序运行目录,或IdOpenSSLSetLibPath指定的路径中(确保路径下是64位DLL,而非32位)。

内容的提问来源于stack exchange,提问作者pjackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:40:11