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

升级RAD Studio 12.2的Indy至10.6.3.6导致SMTP TLS认证失败

升级RAD Studio 12.2的Indy至10.6.3.6导致SMTP TLS认证失败

看起来你在升级Indy组件后碰到了TLS握手的棘手问题,我来帮你梳理下可能的原因和解决方向:

  • 检查SSL上下文的初始化逻辑
    Indy 10.6.3.x分支对SSL/TLS的配置做了更严格的规范,默认协议版本和旧版本有差异。你需要显式指定邮件服务商支持的协议版本,比如:

    IdSSLIOHandler = new TIdSSLIOHandlerSocketOpenSSL();
    IdSSLIOHandler->SSLOptions->Method = sslvTLSv1_2; // 可根据服务商要求调整为sslvTLSv1_3
    IdSSLIOHandler->SSLOptions->Mode = sslmClient;
    

    另外要注意,这个版本的Indy需要兼容的OpenSSL库(建议1.1.1系列及以上),如果RAD Studio自带的OpenSSL版本偏旧,很可能会导致握手失败,建议替换成符合要求的库文件。

  • 验证SMTP端口与连接方式
    不同邮件服务商对TLS连接的端口和流程要求不同,比如587端口用STARTTLS、465端口直接走SSL。新版本Indy对STARTTLS的处理逻辑有优化,你要确认代码里是否正确调用了相关方法:

    IdSMTP->Connect();
    if (IdSMTP->StartTLSSupported()) {
        IdSMTP->StartTLS();
    }
    

    如果用465端口,要确保IdSSLIOHandler已经正确关联到SMTP组件,且SSLOptions的Mode设置无误。

  • 调整组件初始化顺序
    新版本Indy对组件初始化顺序的要求更严格,建议遵循先初始化SSLIOHandler,再关联SMTP组件,最后设置SMTP参数的顺序:

    // 推荐的初始化顺序
    IdSSLIOHandler = new TIdSSLIOHandlerSocketOpenSSL();
    IdSMTP = new TIdSMTP();
    IdSMTP->IOHandler = IdSSLIOHandler;
    IdSMTP->Host = "smtp.yourserver.com";
    IdSMTP->Port = 587;
    IdSMTP->Username = "yourusername";
    IdSMTP->Password = "yourpassword";
    
  • 捕获并查看详细错误信息
    你只提到了TLS握手错误,但具体的错误代码或描述能帮你精准定位问题。可以在代码里添加更详细的异常捕获:

    try {
        // 你的SMTP发送逻辑
    } catch (Exception &e) {
        ShowMessage("错误信息: " + e.Message);
        // 查看SSL相关的详细错误
        ShowMessage("SSL错误详情: " + IdSSLIOHandler->LastErrorText);
    }
    

    这些信息能帮你判断是协议不兼容、证书信任问题,还是OpenSSL库本身的问题。

  • OAuth2配置先放一放
    既然现在TLS握手都失败了,建议先解决这个基础问题再处理OAuth2的配置。等TLS连接正常后,再在sasl-oauth分支中给TIdSMTP的SASLMechanisms添加TIdSASLXOAuth2组件,并设置好AccessToken属性。

你可以先从OpenSSL版本和SSL协议版本这两个方向入手排查,这是新版本Indy升级后最容易踩的坑。如果拿到了具体的错误信息,也能更精准地定位问题~

备注:内容来源于stack exchange,提问作者Barry Andrews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:43:12