Perl通过Office 365发送邮件随机失败,Net::SMTPS返回undef求助
问题解决思路
- 修正TLS版本配置
你当前代码硬编码使用已被Office365弃用的TLS 1.0协议,服务端会随机拒绝低版本TLS的连接请求。将SSL_version参数调整为TLSv1_2及以上版本,或删除该参数让程序自动协商服务端支持的最高版本TLS协议即可。 - 显式配置SNI参数
日志中明确提示not using SNI because hostname is unknown,Office365的SMTP服务依赖SNI完成SSL证书校验,未携带SNI的握手请求会被随机拦截。需要在初始化参数中新增SSL_hostname => 'smtp.office365.com',让SSL握手时携带SNI信息。 - 修正EHLO标识
你当前默认发送的EHLO标识为localhost.localdomain,部分Office365边缘节点会将这类不规范的内网主机名标记为异常,触发流量拦截。可以新增Hello参数,填写你服务器的公网域名或公网IP。 - 新增重试机制
若以上配置调整后仍有极偶发失败,可新增简单的连接重试逻辑,连接失败后间隔12秒重试23次,可覆盖绝大多数网络波动导致的握手失败场景。
调整后参考代码
use Net::SMTPS; my $mailer = Net::SMTPS->new("smtp.office365.com", Port => 587, doSSL => "starttls", SSL_version => "TLSv1_2", SSL_hostname => "smtp.office365.com", Hello => "你的服务器实际公网域名/IP", Debug => 4 ); ...
内容的提问来源于stack exchange,提问作者Yuval Cohen
相关产品推荐
相关产品推荐

