最近公司项目升级,将项目由自己服务器移植到阿里云服务器上,同时将PHP版本由5.4升级到5.6,其中有用到PHPmailer来发送邮件,使用SMTP协议,但升级后一直无法连接SMTP服务器,后经过多次排查,总算解决,特记录一下(如有不足,欢迎批评指正):
排查过程 :
1、查看PHP是否开启sockets和openssl扩展,可通过phpinfo()查看:
2、 查看allow_url_fopen是否打开:
如果未开启,则在php.ini中打开allow_url_fopen = On,并重启服务器。
3、查看禁用函数:
disable_functions= pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
中是否禁用了fsockopen () 和pfsockopen() 以及 stream_socket_client() 三个函数。
4、查看防火墙:
#sestatus -b | grep httpd
5、查看httpd_can_sendmail是不是打开的,没有的话用命令打开:
setsebool -P httpd_can_sendmail on
setsebool -P httpd_can_network_connect on
6、检查端口是否被占用:
SMTP的默认端口是25,检查未被占用,后查询说阿里云默认关闭25端口,然后改用465端口 (一定要在安全组规则内打开此端口),但依旧无法连接。
注:465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。
7、关闭SSL证书验证:
因为PHP 5.6引入了SSL证书验证,因此如果您的配置中断,则会显示错误,此时可修改SMTPOptions为不验证:
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
在关闭SSL验证后,邮件发送成功。
8、连接代码:
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = $arrSmtpinfo['server']; //smtp 服务器信息
$mail->SMTPAuth = true;
$mail->Username = $arrSmtpinfo['sender']; // 发件人
$mail->Password = $arrSmtpinfo['sender_pwd']; // 发件人 密码
$mail->SMTPSecure = 'ssl'; //一定要开启
$mail->Port =465; // 端口
$mail->setFrom($arrSmtpinfo['sender'], 'Mailer'); //发件人
$mail->addAddress($strEmail, ''); // 收件人
$mail->addAddress($strEmail);
$mail->addCC($strEmail);
$mail->addAttachment('********'); // 添加附件
$mail->isHTML(true); // HTML
$mail->Subject = '***********'; //主题
$mail->Body = '************** '; //邮件内容
$mail->AltBody = '*************************';
if($mail->send()) {
echo “success”;
}