【问题标题】:SMTPError: Password command Failed PHPMailerSMTPError:密码命令失败 PHPMailer
【发布时间】:2020-06-09 04:16:04
【问题描述】:

要求是提交表单时,邮件必须发送到指定的电子邮件地址。为此,我正在使用 PHPMailer。

当我第一次从本地主机运行代码时,我收到了 Gmail 中收到的 Critical Security Alert,我通过打开“允许不太安全的应用程序”解决了这个问题,并且还 检查并批准了安全事件。

现在代码在由 xampp 提供支持的 localhost 中完美运行,但在共享主机中却无法正常运行。当我点击共享主机中的表单页面中的提交按钮时,我收到以下消息:

2020-02-25 09:48:40 SERVER -&gt; CLIENT: 220 smtp.gmail.com ESMTP t131sm5033428oih.35 - gsmtp<br>
2020-02-25 09:48:40 CLIENT -&gt; SERVER: EHLO www.domain_name.com<br>
2020-02-25 09:48:40 SERVER -&gt; CLIENT: 250-smtp.gmail.com at your service, [AAA.BB.CCC.DD]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8<br>
2020-02-25 09:48:40 CLIENT -&gt; SERVER: STARTTLS<br>
2020-02-25 09:48:40 SERVER -&gt; CLIENT: 220 2.0.0 Ready to start TLS<br>
2020-02-25 09:48:44 CLIENT -&gt; SERVER: EHLO www.domain_name.com<br>
2020-02-25 09:48:44 SERVER -&gt; CLIENT: 250-smtp.gmail.com at your service, [AAA.BB.CCC.DD]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8<br>
2020-02-25 09:48:44 CLIENT -&gt; SERVER: AUTH LOGIN<br>
2020-02-25 09:48:44 SERVER -&gt; CLIENT: 334 VXNlcm5hbWU6<br>
2020-02-25 09:48:44 CLIENT -&gt; SERVER: [credentials hidden]<br>
2020-02-25 09:48:44 SERVER -&gt; CLIENT: 334 UGFzc3dvcmQ6<br>
2020-02-25 09:48:44 CLIENT -&gt; SERVER: [credentials hidden]<br>
2020-02-25 09:48:45 SERVER -&gt; CLIENT: 534-5.7.14 &lt;https://accounts.google.com/signin/continue?sarp=1&amp;scc=1&amp;plt=AKgnsbv534-5.7.14 ymrjiXdYur3ddtR_6o2GrGNO2DfOQ7VhdphcGz7dq3__0gTNj1-oIXqZ__3KYGCWXt-ZC534-5.7.14 znNW-khosAGrPwCN1mDscVVYa5ms25Ann9jrAUU39WELRqwVrSmhOMGa91Ec4JRu&gt;534-5.7.14 Please log in via your web browser and then try again.534-5.7.14  Learn more at534 5.7.14  https://support.google.com/mail/answer/78754 t131sm5033428oih.35 - gsmtp<br>
2020-02-25 09:48:45 SMTP ERROR: Password command failed: 534-5.7.14 &lt;https://accounts.google.com/signin/continue?sarp=1&amp;scc=1&amp;plt=AKgnsbv534-5.7.14 ymrjiXdYur3ddtR_6o2GrGNO2DfOQ7VhdphcGz7dq3__0gTNj1-oIXqZ__3KYGCWXt-ZC534-5.7.14 znNW-khosAGrPwCN1mDscVVYa5ms25Ann9jrAUU39WELRqwVrSmhOMGa91Ec4JRu&gt;534-5.7.14 Please log in via your web browser and then try again.534-5.7.14  Learn more at534 5.7.14  https://support.google.com/mail/answer/78754 t131sm5033428oih.35 - gsmtp<br>
SMTP Error: Could not authenticate.<br>
2020-02-25 09:48:45 CLIENT -&gt; SERVER: QUIT<br>
2020-02-25 09:48:45 SERVER -&gt; CLIENT: 221 2.0.0 closing connection t131sm5033428oih.35 - gsmtp<br>
SMTP Error: Could not authenticate.<br>

发送邮件的PHPMailer代码如下:

try {
            //Server settings
            $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
            $mail->isSMTP();                                            // Send using SMTP

            $mail->Host       = 'smtp.gmail.com';                           // Set the SMTP server to send through
            $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
            $mail->isHTML();
            $mail->Username   = 'username@gmail.com';   // SMTP username
            $mail->Password   = 'password';                     // SMTP password

            $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
            $mail->Port       = 587;                                    // TCP port to connect to

            //Recipients
            $mail->setFrom('username@gmail.com');
            $mail->addAddress('username@yahoo.com');    // Add a recipient

            // Content
            $mail->isHTML(true);                                        // Set email format to HTML
            $mail->Subject = 'Mail subject';
            $mail->Body = 'Mail Body';

            $mail->send();
            echo 'done';
        } catch (Exception $e) {
            echo "Mailer";
        }


已采取以下措施:

  1. 用户名和密码组合正确且未过期。 通过网络登录手动验证,并从 本地主机。

  2. $mail->SMTPAuth=false 无法设置,因为多数 的共享主机提供商似乎已禁用此功能以确保安全 原因(主要是为了避免垃圾邮件和发送不请自来的电子邮件)

【问题讨论】:

  • 如果“允许安全性较低的应用程序”处于开启状态,您可能在 Gmail 帐户中启用了两步验证。如果是这种情况,您需要创建一个应用程序专用密码。 lifewire.com/…
  • @ShashankShah 感谢您的回复 :) 在这种情况下,未设置两因素身份验证。简而言之,身份验证基于用户名和密码。如果它在那里,我什至无法从 localhost 发送邮件,这是可能的。我可以从本地主机发送邮件
  • 看来您只需要为 $mail->setFrom( username@gmail.com ) 中提到的 Gmail 帐户启用安全性较低的应用程序即可解决此问题。
  • @ShashankShah 兄弟,其实我在帖子里已经提过了。
  • 是的,我正在审查的所有可能的案例都只有这个!让我深入研究一下

标签: php smtp phpmailer


【解决方案1】:

仅供参考!要解决此问题,您必须访问:

https://myaccount.google.com/security?pli=1#connectedapps 然后点击允许安全性较低的应用为是

不太安全的应用程序意味着什么?我们能否更改我们的常见问题解答说明和/或实施,以便用户无需执行此额外步骤?

如果不可能,我们至少应该在常见问题解答中记录用户还需要更改其 google 安全帐户的设置

您的解决方案:

您的服务器不支持 phpmailer。

您的帐户被视为垃圾邮件阅读此处:Prevent mail to Gmail users from being blocked or sent to spam

使用或修复应用密码

如果您已开启两步验证并尝试通过设备、移动应用或桌面应用登录您的 Google 帐户,则需要输入应用密码。

在此处查看更多信息并按照步骤操作:Use or fix App password

如果您使用 SMTP(即您正在呼叫 isSMTP()),您可以使用 SMTPDebug 属性获取 SMTP 对话的详细记录。设置如下:

Enabling debug output and troubleshooting

如果您在通过 SMTP 服务器连接或发送电子邮件时遇到问题,SMTP 类可以提供有关正在发生的处理/错误的更多信息。

使用该类的调试功能来查看您的连接中发生了什么。为此,请在脚本中设置调试级别。

允许错误级别例如:

$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->SMTPDebug = 4; //from 1 to 4 to get more details.

我的错误几乎相同,由于我的自签名证书,这段代码解决了我的问题。

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

再次看到SMTP Debugging

Debug levels

Debug output format

看起来您正在尝试通过 curl api 或 SERVER: EHLO 进行连接,如果是这样的话!请将您的代码添加到问题中。

【讨论】:

  • 虽然这确实“解决”了一些问题,但就 google 而言,“正确”的方式不是使用安全性较低的应用程序开关,而是使用 XOAUTH2 进行身份验证,这已涵盖在 PHPMailer 文档和示例中。设置起来很繁琐,但确实有效。
  • 是的,我同意你的大网站!谷歌说这不是使用不太安全的帐户的好方法,我多年来一直这样做,除了每天限制 50 封电子邮件之外没有任何问题:) 发送邮件的最佳方法是找到一个好的托管或 vps 服务器或建立自己的服务器,并根据需要进行设置,对于一个小型网站,我不会担心安全性较低的 google 帐户,如果您使用安全密码并保护您的代码,没有人可以破解它。其实我不在乎谷歌说什么,他们都希望我们使用他们的产品并赚钱(一切都是为了钱)。所以,阅读它们,但做你想做的,而不是他们想做的:)
  • @Dlk 感谢您的回复。我已经采取了您在解决方案中提到的步骤,除了 XOAuth 之外,我也在我的问题中说明了这些步骤,因为在我的场景中不需要这样做。我的服务器支持 PHPMailer 并且还发布了 SMTP 错误日志。我还有什么遗漏的吗?
【解决方案2】:

好吧,经过长时间的战斗,我设法解决了这个问题。我从以下 URL 激活了 DisplayUnlockCaptcha: https://accounts.google.com/b/0/DisplayUnlockCaptcha

可能是因为 Gmail 可能会将来自托管服务器中的 PHP 文件的登录信息视为不受信任的请求。这是因为托管服务器可能位于不同的地方或国家/地区,并且收到的登录身份验证请求与 Gmail 帐户经常登录的请求不同。所以作为一种安全措施,它会在后台使用一些验证码机制(无法查看)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2016-11-13
    • 2014-03-23
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多