我试图使用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都是匿名的。
答案 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。