PHPMailer连接Exchange 2010提示SSL: Success错误如何排查解决
可尝试的排查与解决方向
1. 强制指定TLS协商版本
PHP 5.6版本的openssl扩展默认的TLS协商逻辑和Exchange 2010存在适配问题,可在SMTPOptions配置中明确指定TLS版本解决:
$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, // 优先指定TLS 1.2,测试不通过可替换为STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT、STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT ) );
2. 内网场景直接关闭STARTTLS加密
你使用内网IP连接Exchange 25端口,传输链路本身可信,可关闭TLS加密直接提交:
- 新增配置
$mail->SMTPAutoTLS = false;,禁止PHPMailer自动发起STARTTLS请求 - 将
$mail->SMTPSecure设置为空字符串 - 配合修改Exchange接收连接器配置,取消「仅在启动TLS之后提供基本身份验证」的勾选
3. 检查Exchange接收连接器配置
登录Exchange 2010的Exchange管理控制台,定位到你配置的专用接收连接器,确认以下配置:
- 身份验证标签页已勾选「基本身份验证」「传输层安全性(TLS)」
- 权限组标签页已给对应发信账号所属权限组开放「提交邮件」权限
- 接收连接器的远程IP范围包含你PHP服务的出口IP
4. 排查openssl扩展兼容性
输出phpinfo()查看当前openssl扩展版本,若版本低于1.0.1,升级openssl扩展后重试,老旧版本openssl和Exchange 2010的TLS握手存在已知兼容缺陷。
5. 降级PHPMailer版本
你当前使用的PHPMailer 6对PHP 5.6的边缘场景适配不足,可降级到PHPMailer 5.2稳定版本,该版本对老旧PHP环境和Exchange 2010的兼容性更好。
6. 命令行验证TLS握手状态
在PHP部署服务器上执行openssl命令直接测试握手状态,快速定位问题层级:
# 分别替换-tls1_2为-tls1_1、-tls1测试不同TLS版本 openssl s_client -connect 192.168.123.123:25 -starttls smtp -tls1_2
若所有版本均握手失败,优先排查内网防火墙、WAF等设备是否存在TLS拦截规则,若某个版本握手成功,对应在PHP配置中指定相同的TLS版本即可。
内容的提问来源于stack exchange,提问作者MiK
相关产品推荐
相关产品推荐

