当前位置: 首页 > 知识库问答 >
问题:

需要使用php mailer从gmail发送邮件,而无需启用“不太安全的应用程序”并生成“应用程序密码”

步炯
2023-03-14

我正在尝试使用php邮件从我的gmail帐户发送邮件。

我知道,为了使用php邮件程序发送邮件,我们需要从gmail帐户设置中启用“不太安全的应用程序”。

还有一个选项,在不启用“不太安全的应用程序”的情况下,我们可以通过启用两步验证从不太安全的应用程序发送邮件来使用“应用程序密码”。

但问题是使用“应用程序密码”,我无法发送来自php的邮件,邮件中出现用户名和密码不被接受的错误。

我搜索发现,我们无法使用“应用程序密码”从安全性较低的应用程序发送邮件。从此链接中找到https://support.google.com/accounts/answer/185833?hl=en

Iam使用以下php邮件程序代码发送邮件:

<?php
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// Load Composer's autoloader
require 'vendor/autoload.php';
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 2;                                       // Enable       verbose debug output
$mail->isSMTP();                                            // Set mailer to use SMTP
$mail->Host       = 'ssl://smtp.gmail.com';                 // Specify main and backup SMTP servers
$mail->SMTPAuth   = true;                                   // Enable SMTP authentication
$mail->Username   = username;
$mail->Password   = password;
$mail->SMTPSecure = 'ssl';                                  // Enable TLS encryption, `ssl` also accepted
$mail->Port       = 465;
//Recipients
$mail->setFrom('test@gmail.com', 'Test');
$mail->addAddress('test1@gmail.com', 'Test1');     // Add a recipient
$mail->addAddress('test2@gmail.com');               // Name is optional
$mail->addReplyTo('test@gmail.com', 'Test');
// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

使用“APP密码”时出现以下错误消息。

2019-09-04 07:24:15 CLIENT -> SERVER: EHLO localhost
2019-09-04 07:24:15 CLIENT -> SERVER: AUTH LOGIN
2019-09-04 07:24:16 CLIENT -> SERVER: <credentials hidden>
2019-09-04 07:24:16 CLIENT -> SERVER: <credentials hidden>
2019-09-04 07:24:16 SMTP ERROR: Password command failed: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/?p=BadCredentials z12sm8871955pfj.41 - gsmtp
SMTP Error: Could not authenticate.
2019-09-04 07:24:16 CLIENT -> SERVER: QUIT
SMTP Error: Could not authenticate.
Message could not be sent. Mailer Error: SMTP Error: Could not authenticate.

请给出一个在不启用“不太安全的应用程序”和使用gmail“应用程序密码”的情况下发送邮件的解决方案

我还使用了第三个选项—XOAUTH2身份验证来发送邮件。以下是我的代码:

    <?php
    /**
     * This example shows how to send via Google's Gmail servers using XOAUTH2 authentication.
     */
    //Import PHPMailer classes into the global namespace
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\OAuth;
    // Alias the League Google OAuth2 provider class
    use League\OAuth2\Client\Provider\Google;
    //SMTP needs accurate times, and the PHP time zone MUST be set
    //This should be done in your php.ini, but this is how to do it if you don't have access to that
    date_default_timezone_set('Etc/UTC');
    //Load dependencies from composer
    //If this causes an error, run 'composer install'
    require 'vendor/autoload.php';

    $send_to_address = $_GET['email'];
    $send_to_name = $_GET['name'];


    //Create a new PHPMailer instance
    $mail = new PHPMailer;
    //Tell PHPMailer to use SMTP
    $mail->isSMTP();
    //Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;
    //Set the hostname of the mail server
    $mail->Host = 'smtp.gmail.com';
    //Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
    $mail->Port = 587;
    //Set the encryption system to use - ssl (deprecated) or tls
    $mail->SMTPSecure = 'tls';
    //Whether to use SMTP authentication
    $mail->SMTPAuth = true;
    //Set AuthType to use XOAUTH2
    $mail->AuthType = 'XOAUTH2';
    //Fill in authentication details here
    //Either the gmail account owner, or the user that gave consent
    $email = 'gts@goodway.in';
    $clientId = '315061611767-fitjjndpsi6uo1j7hn923loaa0dg1ch1.apps.googleusercontent.com';
    $clientSecret = '3m-47D5Ojvpnfqp5qxxQ2WLn';
    //Obtained by configuring and running get_oauth_token.php
    //after setting up an app in Google Developer Console.
    $refreshToken = '4/qgEr9g7oYr2jk-q2YZpDbD5GCKK0oMdUHrVwsww9t5tXey5zr4fcjhS4Mk25rLcklEkUl4F20iKKmy-CAMme5r8';
    //Create a new OAuth2 provider instance
    $provider = new Google(
        [
            'clientId' => $clientId,
            'clientSecret' => $clientSecret,
        ]
    );
    //Pass the OAuth provider instance to PHPMailer
    $mail->setOAuth(
        new OAuth(
            [
                'provider' => $provider,
                'clientId' => $clientId,
                'clientSecret' => $clientSecret,
                'refreshToken' => $refreshToken,
                'userName' => $email,
            ]
        )
    );
    //Set who the message is to be sent from
    //For gmail, this generally needs to be the same as the user you logged in as
    $mail->setFrom($email, 'Gudbiz');
    //Set who the message is to be sent to
    $mail->addAddress($send_to_address, $send_to_name);
    //Set the subject line
    $mail->Subject = 'PHPMailer GMail XOAUTH2 SMTP test';
    //Read an HTML message body from an external file, convert referenced images to embedded,
    //convert HTML into a basic plain-text alternative body
    $mail->CharSet = 'utf-8';
    //$mail->msgHTML(file_get_contents('contentsutf8.html'), __DIR__);
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    //Replace the plain text body with one created manually
    $mail->AltBody = 'This is a plain-text message body';
    //Attach an image file
    //$mail->addAttachment('images/phpmailer_mini.png');
    //send the message, check for errors
    if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }

使用上述代码,我得到如下输出:

    2019-09-04 11:52:57 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP v8sm7946021pje.6 - gsmtp
    2019-09-04 11:52:57 CLIENT -> SERVER: EHLO testapi.howorkforce.com
    2019-09-04 11:52:58 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [13.126.85.98]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
    2019-09-04 11:52:58 CLIENT -> SERVER: STARTTLS
    2019-09-04 11:52:58 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
    2019-09-04 11:52:58 CLIENT -> SERVER: EHLO testapi.howorkforce.com
    2019-09-04 11:52:58 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [13.126.85.98]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8

但是邮件没有发送。请提出解决方案。

请使用“SMTP调试4”查找其他信息

    2019-09-05 11:51:05 Connection: opening to smtp.gmail.com:587, timeout=300, options=array()
    2019-09-05 11:51:05 Connection: opened
    2019-09-05 11:51:05 SMTP INBOUND: "220 smtp.gmail.com ESMTP l23sm2317472pjy.3 - gsmtp"
    2019-09-05 11:51:05 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP l23sm2317472pjy.3 - gsmtp
    2019-09-05 11:51:05 CLIENT -> SERVER: EHLO localhost
    2019-09-05 11:51:06 SMTP INBOUND: "250-smtp.gmail.com at your service, [103.125.155.132]"
    2019-09-05 11:51:06 SMTP INBOUND: "250-SIZE 35882577"
    2019-09-05 11:51:06 SMTP INBOUND: "250-8BITMIME"
    2019-09-05 11:51:06 SMTP INBOUND: "250-STARTTLS"
    2019-09-05 11:51:06 SMTP INBOUND: "250-ENHANCEDSTATUSCODES"
    2019-09-05 11:51:06 SMTP INBOUND: "250-PIPELINING"
    2019-09-05 11:51:06 SMTP INBOUND: "250-CHUNKING"
    2019-09-05 11:51:06 SMTP INBOUND: "250 SMTPUTF8"
    2019-09-05 11:51:06 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [103.125.155.132]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
    2019-09-05 11:51:06 CLIENT -> SERVER: STARTTLS
    2019-09-05 11:51:06 SMTP INBOUND: "220 2.0.0 Ready to start TLS"
    2019-09-05 11:51:06 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
    2019-09-05 11:51:06 CLIENT -> SERVER: EHLO localhost
    2019-09-05 11:51:06 SMTP INBOUND: "250-smtp.gmail.com at your service, [103.125.155.132]"
    2019-09-05 11:51:06 SMTP INBOUND: "250-SIZE 35882577"
    2019-09-05 11:51:06 SMTP INBOUND: "250-8BITMIME"
    2019-09-05 11:51:06 SMTP INBOUND: "250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
    2019-09-05 11:51:06 SMTP INBOUND: "250-ENHANCEDSTATUSCODES"
    2019-09-05 11:51:06 SMTP INBOUND: "250-PIPELINING"
    2019-09-05 11:51:06 SMTP INBOUND: "250-CHUNKING"
    2019-09-05 11:51:06 SMTP INBOUND: "250 SMTPUTF8"
    2019-09-05 11:51:06 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [103.125.155.132]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
    2019-09-05 11:51:06 Auth method requested: XOAUTH2
    2019-09-05 11:51:06 Auth methods available on the server: LOGIN,PLAIN,XOAUTH2,PLAIN-CLIENTTOKEN,OAUTHBEARER,XOAUTH

共有2个答案

邵璞
2023-03-14

我找到了解决办法。我使用的刷新令牌就是那个,这让我非常头痛。

我使用的“刷新令牌”无效。一旦我重新生成刷新令牌,一切似乎都很好。邮件发送正确。

韦智刚
2023-03-14

如果要避免这些情况,唯一剩下的选择是使用PHPMailer支持的XOAUTH2身份验证。它很难配置,也很复杂,而且可能会发生更改,因此,我不会将代码粘贴到这里以使其过时,而是让您参考源代码。将代码基于PHPMailer提供的gmail OAuth示例,并使用项目wiki中的PHPMailer gmail xoauth2指南对其进行配置和获取凭据。

 类似资料:
  • 我正在尝试使用Java向Gmail帐户发送邮件,代码如下。我似乎做的每件事都是正确的,但我收到了身份验证失败的消息。谷歌想让我打开“不太安全的应用”功能来实现传输。 有没有一种方法可以让Gmail对Java满意,并且不会出现“打开不太安全的应用程序”的错误? 错误: 代码: 我已经做了研究,所以据我所知,代码不是问题所在,只是没有看到一个解决方案,用于不太安全的应用程序消息。 参考文献: 参考文献

  • 我想使用python 3.4脚本从我的gmail地址发送邮件。我使用以下代码: 如果我在我的gmail帐户中“允许不太安全的应用”,脚本就可以正常工作。然而,如果我禁用“不太安全的应用程序”,它将不起作用(我收到一封来自谷歌的警告电子邮件,其中“登录尝试被阻止”)。我想修改我的代码,以便能够在不启用此功能的情况下发送邮件。 我看了所有关于类似问题的问答,但没有找到任何有用的答案或方法。有人对此有解

  • 应用属性: 此代码只能从gmail发送电子邮件(为不太安全的应用程序启用),它可以发送邮件,但我想要的是邮件应该发送任何公司id而不是gmail,尝试在此代码中添加其他电子邮件id,但错误为“用户名和密码不被接受”,有人能建议我需要做哪些更改才能使其适用于任何电子邮件id吗?请建议最佳方法(如有)?

  • 我使用Android Studio和这个库;https://github.com/yesidlazaro/GmailBackground . 我正在尝试从我的android应用程序发送电子邮件。但是每当我尝试从Gmail帐户发送电子邮件时,它都不起作用。因为谷歌将我的应用程序固定为“不太安全的应用程序”并阻止它。 我不得不从gmail的安全设置中允许不太安全的应用程序。但我不想这样做。我如何解决这

  • 我们可以在PHPmailer中实现什么样的安全性,使其成为更安全的Gmail应用程序?https://support.google.com/accounts/answer/6010255我正在使用PHPmailer通过Gmail发送电子邮件。PS:我不想在此处启用“访问不太安全的应用程序”:https://www.google.com/settings/security/lesssecureapp

  • 所以我遇到了这个不太安全的应用程序 我想知道是否有其他选择?我需要能够通过我的应用程序阅读电子邮件和下载附件,而无需用户自己这么做,因此Gmail API在我看来并不好。 如果不启用此选项,我也找不到任何其他访问gmail收件箱的选项。。。谢谢你的时间。