如何强制PhpMailer 5.2使用TLS 1.2协议连接邮件服务器
PHPMailer 5.2 强制使用TLS 1.2 解决方案
前置校验
先确认你的运行环境满足最低要求:
- PHP版本 >= 5.3.19
- 服务器openssl版本 >= 1.0.1
如果低于以上版本,TLS 1.2支持不完整,需要先升级对应依赖组件。
方案1:修改实例化配置(无需改源码,优先使用)
在你调用$mail->send()方法之前,添加以下配置代码:
// 配置SMTP连接参数强制走TLS 1.2 $mail->SMTPOptions = [ 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => false, // 低版本PHP没有内置STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT常量的话,直接写数值7即可 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT ] ]; // 确认加密模式和端口配置匹配服务商要求 $mail->SMTPSecure = 'tls'; $mail->Port = 587; // 若服务商要求走465端口SSL模式,替换上面两行为: // $mail->SMTPSecure = 'ssl'; // $mail->Port = 465;
说明:如果你的PHP版本低于5.3.19没有对应常量,将STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT替换为数值7即可生效
方案2:修改PHPMailer源码(方案1不生效时使用)
- 打开PHPMailer 5.2的核心文件
class.phpmailer.php - 搜索找到调用
stream_socket_enable_crypto函数的代码段 - 将该函数的第三个加密方法参数,直接替换为
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT或者数值7,修改后示例:
if (!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT)) { // 原有的错误处理逻辑不用修改 return false; }
验证方式
修改完成后写简单的测试脚本执行发信,若没有返回TLS版本不兼容的报错,且邮件正常发送即为配置成功。
内容的提问来源于stack exchange,提问作者Timothy Jeffcoat
相关产品推荐
相关产品推荐

