«
emlog pro 后台邮件通知不支持 Outlook 邮箱修复

时间:2022-6-19     作者:Mrxn     分类: 技术文章


前言

缘起是博客的邮件通知插件突然挂掉了,在修的过程中,发现后台有个邮件通知功能,主要是用于找回密码,注册验证这类作用,测试了下也不行,就顺手修复了在此小计(水文)一篇

问题&解决

主要是 Outlook 邮箱的 SMTP 使用的是 STARTTLS:

STARTTLS,是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用SSL或TLS加密),而不需要使用另一个特别的端口来进行加密通信,属于机会性加密。

此种协议的安全相关参考此文: 电子邮件环境下STARTTLS的安全性分析

邮件通知功能原来的关键代码如下:

$mail = new PHPMailer(true);
$mail->IsSMTP();                                       // SMTP 使用smtp鉴权方式发送邮件
$mail->CharSet = 'UTF-8';                              // 字符编码
$mail->SMTPAuth = true;                                // 开启认证
$mail->SMTPSecure = 'ssl';                             // 设置使用 ssl 加密方式登录鉴权
$mail->Port = $data["smtp_port"];                      // 端口
$mail->Host = $data["smtp_server"];                    // STMP 服务器地址
$mail->Username = $data["smtp_mail"];                  // 邮箱账号
$mail->Password = $data["smtp_pw"];                    // SMTP 授权码
$mail->From = $data["smtp_mail"];                      // 发送方
$mail->AddAddress($data["testTo"]);                    // 接收方
$mail->Subject = "测试邮件";
$mail->Body = "这是一封测试邮件";

其中 $mail->SMTPSecure 设置的值为 SSL : L308
修改为如下即可支持 STARTTLS :

// $mail->SMTPSecure = 'ssl';                             // 设置使用 ssl 加密方式登录鉴权
if ($mail->Host == 'smtp.office365.com') $mail->SMTPSecure = 'STARTTLS';
if ($mail->Host == 'smtp.gmail.com') $mail->SMTPSecure = 'SSL';

注释原有的设置,添加两行判断分别设置一下即可正常使用 Outlook 邮箱发信。

PS:也需要注意邮箱密码带有特殊符号,在设置处传递到后端的时候被转义

另外,在本地调试的时候,如果提示证书错误(SSL ):

smtp_code:"stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed"

可以设置下不校验 SSL 证书,且允许使用自签证书:

$mail->SMTPOptions = array(
        'ssl' => array(
                 'verify_peer' => false,
                 'verify_peer_name' => false,
                 'allow_self_signed' => true
             )
    );

到此,问题解决!睡觉,人年纪大了后熬不动了~_~ ,不像之前动不动就熬鹰!

标签: emlog