PHPMailer正在将我的SMTP主机更改为我的主机名,导致它失败

时间:2017-09-05 16:00:25

标签: php email smtp phpmailer

我试图使用gmails SMTP服务器发送。对于这个确切的场景,PHPMailer中有一个相当清晰的示例,但是在关注它之后我得到了一个错误,因为(在我看来)主机在指定之后已经更改为我的本地主机名?

错误:

Peer certificate CN=`myhostname' did not match expected CN=`smtp.gmail.com' 
[/app/versions/dev/vendor/phpmailer/phpmailer/src/SMTP.php line 389]

代码:

$mail = new PHPMailer();
$mail->isSMTP();
$mail->SMTPOptions = [
  'ssl' => [
    'verify_peer' => false,
    // 'verify_peer_name' => false,
    // 'allow_self_signed' => true
  ]
];
$mail->SMTPDebug = 3;
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = 'mygmail@gmail.com';
$mail->Password = 'mypass';
$mail->AddAddress('mygmail@gmail.com', 'My Name');
$mail->Subject = 'subject';
$mail->MsgHTML($message);
echo $mail->send();
exit;

我可以在PHPMailer.php:1772中看到,如果没有指定$ Helo,它会回退到serverHostname(),但是当我查看$ Helo的docblock时,它指的是$ Hostname,它不会#39; t存在。

myhostname,mygmail @ gmail.com,mypass都是匿名的。

2 个答案:

答案 0 :(得分:0)

如果SMTP邮件路由到你的域,你可能也需要更改,你需要通过更改php.ini smtp域来设置你的PHP应用程序。

 //php.ini
 [mail function]
 ; For Win32 only.
 ; http://php.net/smtp
 SMTP = smtp.yourdomain.com

在php程序的顶部,程序启动加载器构造函数,你需要添加这个微小的代码:

//php index contructor loader ...
ini_set("SMTP","smtp.example.com" );
ini_set('sendmail_from', 'user@example.com'); 

此致

答案 1 :(得分:0)

这不是PHPMailer正在做的事情。阅读错误说明的内容:您要求连接到smtp.gmail.com,但最终连接到其他内容,因此证书名称不匹配。这可能是因为您的ISP拦截了您的SMTP流量并将其重定向到自己的邮件服务器,邮件服务器名称不同 - 这很常见。这与Hostname属性无关。

这正是你检查证书的原因 - 他们正在做的是中间人攻击,这是TLS保护你的事情之一,因此禁用检查是绝对是错误的做法,这也意味着你已经将你的gmail凭证交给了你的ISP,所以你可能想要更改你的Gmail密码。

正确的解决方案是从您的ISP中找出他们希望您用于出站电子邮件的安排(可能是使用他们的邮件服务器),并更改您的脚本以便故意使用,而不是意外,然后证书名称将匹配。

然后你会遇到一个不同的问题 - 大多数互联网服务提供商,比如谷歌,尤其是雅虎,都设置了SPF记录,这些记录会标记来自网络外部的邮件,这些邮件说它们被发送为无效,并可能最终被收件人阻止

解决方案是使用ISP的发件人地址发送,而不是使用gmail。

最佳解决方案是使用不会阻止流量的ISP。