如何解决PHPMailer发送邮件时SSL证书验证失败问题?
解决PHPMailer SSL证书验证失败无法发送邮件的问题
先修正你代码里的基础语法错误,这些问题可能间接影响运行:
- 把中文引号(
’)替换为英文引号(') $mail->Username = *****末尾补充分号$mail->Subject = 'email test;补全闭合的单引号- 替换
Host和邮箱地址里的@占位符为真实域名
核心问题:SSL证书验证失败
从日志可以看到,连接SMTP服务器并执行STARTTLS指令后,证书验证环节失败,以下是针对性解决思路:
1. 验证SMTP服务器证书有效性
在终端执行命令(替换为你的真实SMTP域名),检查证书状态:
openssl s_client -connect mail.yourdomain.com:25 -starttls smtp
重点确认:
- 证书未过期
- 证书绑定域名与SMTP服务器域名一致
- 证书由受信任的CA机构颁发
2. 手动指定CA证书路径
如果服务器默认CA证书库未包含SMTP服务器的根证书,给PHPMailer配置明确的CA证书路径:
// 初始化PHPMailer后添加该配置 $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => true, 'verify_peer_name' => true, 'cafile' => '/usr/local/etc/openssl/cacert.pem' // 替换为服务器上CA证书的实际路径 ) );
3. 临时关闭证书验证(仅测试环境使用)
如果是测试场景且无法快速修复证书问题,可临时禁用验证(生产环境严禁使用,存在安全风险):
$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );
4. 确认端口与加密方式匹配
SMTP服务的端口和加密方式通常对应关系:
- 端口25/587 →
SMTPSecure = 'tls' - 端口465 →
SMTPSecure = 'ssl'
建议优先尝试587端口,多数服务商推荐该端口用于TLS加密连接。
修正后的完整示例代码
$mail = new PHPMailer(); $mail->isSMTP(); $mail->Host = 'mail.yourdomain.com'; // 替换为真实SMTP域名 $mail->SMTPAuth = true; $mail->Username = 'your-email@yourdomain.com'; // 真实邮箱账号 $mail->Password = 'your-email-password'; // 真实邮箱密码 $mail->SMTPSecure = 'tls'; $mail->Port = 587; // 选择适合你的SSL配置方案 $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => true, 'verify_peer_name' => true, 'cafile' => '/path/to/cacert.pem' ) ); $mail->setFrom('sender@yourdomain.com', 'John'); $mail->addAddress('recipient@example.com', 'Doe'); $mail->Subject = 'email test'; $mail->isHTML(true); $mail->Body = '<h1>Test Email Content</h1>'; // 正确的HTML格式 if(!$mail->send()){ echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message has been sent'; }
内容的提问来源于stack exchange,提问作者János Tóth
相关产品推荐
相关产品推荐

