【问题标题】:Could not authenticate Google account through PHPMailer无法通过 PHPMailer 验证 Google 帐户
【发布时间】:2020-12-02 14:34:39
【问题描述】:

我在通过 Gmail 发送电子邮件的简单脚本中使用 PHPMailer,我收到此错误(我确定电子邮件和密码组合正确):

!-- 2020-12-02 14:13:16 客户端 -> 服务器:EHLO 本地主机
2020-12-02 14:13:16 客户端 -> 服务器:STARTTLS
2020-12-02 14:13:17 客户端 -> 服务器:EHLO 本地主机
SMTP 错误:无法验证。
2020-12-02 14:13:17 客户端 -> 服务器:退出
SMTP 连接()失败。 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

启用安全性较低的应用

这是我实现phpMailer的方式


use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require './mailer/autoload.php';

$msg = "";
 
$mail = new PHPMailer();

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_CLIENT; 
    $mail->isSMTP(); 
    $mail->Host = 'smtp.google.com'; 
    $mail->SMTPAuth = true; 
    $mail->Username = '********@gmail.com'; 
    $mail->Password = '********';
    $mail->SMTPSecure = "tls";
    $mail->Port = 25; 
    $mail->CharSet= 'UTF-8';
    $mail->setFrom('*******@gmail.com', 'Mailer');
    $mail->addAddress($_POST["mail"]);

    $mail->isHTML(true); 
    $mail->Subject = $_POST["subject"];
    $mail->Body = '<h2>E-mail</h2>';
    $mail->AltBody = $_POST["content"];

    $mail->send();
} catch (Exception $e) {
    $msg = "An Error has Ocurr";
}

我该如何解决这个问题?

【问题讨论】:

    标签: php smtp gmail phpmailer


    【解决方案1】:

    SMTP 端口 25 不与 TLS 一起使用,您应该将端口 587 用于 TLS/STARTTLS 或将 456 用于 SSL。而且您似乎还使用了不正确的主机 URL,它应该是 smtp.google.com。此处说明了所需的配置:https://support.google.com/mail/answer/7126229

    所以你可能应该改变:

    ...
    $mail->Host = 'smtp.google.com';
    $mail->Port = 25;
    ...
    

    收件人:

    ...
    $mail->Host = 'smtp.gmail.com';
    $mail->Port = 587; 
    ...
    

    根据您的情况,使用 Google 的默认 SMTP 可能不是最佳做法。个人使用是可以的,但如果您想发送更多自动电子邮件,您应该寻找其他选项。例如,默认的 Google SMTP 受到严格的速率限制。

    首先,如果您需要,Google SMTP Relay 会产生更多的可配置性。

    当您真的想发送自动或批量电子邮件时,您应该寻找专门为此提供服务的提供商。这不是 Google SMTP 服务器的用途,您很快就会注意到电子邮件没有正确发送或发送。

    【讨论】:

    • 还是不行,我已经用相应的 SMTPSecure 属性更改了端口,这是新的错误(两者都一样)
    • 2020-12-02 14:44:32 SMTP 错误:无法连接到服务器:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机未能响应。 (10060)
      SMTP 连接 () 失败。 github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    • 我刚刚更新了答案,因为我注意到主机也不正确,你也改变了吗?
    • 我现在去看看
    【解决方案2】:

    如果您真的阅读了错误消息并接受了它给您的建议(通过阅读它链接到的指南),这将非常有帮助。

    首先,您只显示客户端调试输出,因此您看不到服务器在说什么,因此您无法知道发生了什么,as the docs say。这样做:

    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    

    没有看到上面写着什么,你就是在盲目地工作。

    也就是说,你在 EHLO 之后立即被踢出局,而你唯一说的是:

    2020-12-02 14:13:17 CLIENT -> SERVER: EHLO localhost
    

    不幸的是,这是不真实的,我猜 gmail 正在呼唤你。 localhost 根据定义不是 Internet 可路由地址,任何对该名称的反向查找都将永远不会匹配您正在连接的 IP,即 not localhost。如果这是自动发生的,请通过显式设置客户端主机手动覆盖它:

    $mail->Helo = 'myhost.example.com';
    

    虽然 RFC 要求 SMTP+STARTTLS 使用端口 587,但 gmail 也支持端口 25,并且您可以看到您的 STARTTLS 命令运行成功,所以这不是问题所在。

    【讨论】:

      【解决方案3】:

      使用端口 587

       $mail->IsSMTP();
          $mail->SMTPDebug    = 0;
          $mail->SMTPAuth     = true;
          $mail->SMTPSecure   = 'tls';
          $mail->Host         = "smtp.gmail.com";
          $mail->Port         = 587;
          $mail->Username     = '********@gmail.com';
          $mail->Password     = '********';
      

      【讨论】:

        猜你喜欢
        • 2020-04-22
        • 2021-09-25
        • 2019-01-23
        • 1970-01-01
        • 2014-01-04
        • 2016-01-16
        • 2014-08-10
        • 2018-11-13
        • 2019-10-11
        相关资源
        最近更新 更多