PHPMailer发送邮件SMTP connect() failed,故障排除详解
排除PHPMailer发送邮件故障,首先开启debug调试模式
$mail->SMTPDebug = SMTP::DEBUG_LOWLEVEL;
debug等级介绍:
SMTP::DEBUG_OFF(0):正常生产设置; 没有调试输出。
SMTP::DEBUG_CLIENT(1):仅显示客户端->服务器消息。 不要使用它-很难告诉您任何有用的信息。
SMTP::DEBUG_SERVER(2):显示客户端->服务器和服务器->客户端消息-这通常是您想要的设置
SMTP::DEBUG_CONNECTION(3):作为2,还显示有关初始连接的详细信息; 仅在连接出现问题时才使用此功能(例如,连接超时)
SMTP::DEBUG_LOWLEVEL(4):为3,但还显示详细的底层流量。 仅对分析协议级错误非常有用,非常冗长,可能不是您所需要的。
如果开了DEBUG_LOWLEVEL调试,调试进去会看到错误提示:
stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:140900
最终提示是:Could not connect to SMTP host
原因是升到php5.6后默认开启验证
添加参数,去掉验证:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
)
)
如果是使用163邮箱发送邮件,有可能会发送不出去,是因为163邮箱开启了反垃圾邮件政策。
我的解决办法是,抄送一份给发送邮件。
$phpmailer->addCC('[email protected]', 'name');
默认情况下,PHP 5.6验证SSL证书,如果您的证书不匹配,则会出现此错误。正确的解决方案是修复您的SSL配置 - 这不是PHP的错误! 如果您正在本地发送,您可以使用isMail(),而不会通过加密层。
不过,官方的建议是,为了安全起见,还是建议大家效验ssl证书的。关于PHP是如何效验ssl证书的
在PHPMailer里效验证书的方法,是有给出配置的:
$mail->SMTPOptions = array ( 'ssl' => array( 'verify_peer' => true, 'verify_depth' => 3, 'allow_self_signed' => true, 'peer_name' => 'smtp.example.com', 'cafile' => '/etc/ssl/ca_cert.pem', ) );