使用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
相关产品推荐
相关产品推荐

