我试图通过GMail的SMTP服务器从PHP页面发送电子邮件,但我得到这个错误:

身份验证失败[SMTP: SMTP服务器不支持身份验证(code: 250, response: mx.google.com at your service, [98.117.99.235] SIZE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

有人能帮忙吗?这是我的代码:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>

当前回答

自2022年5月30日起,谷歌将不再支持使用允许您使用用户名和密码登录谷歌帐户的第三方应用程序和设备。

但是,谷歌提供了一个简单的解决方案。

请输入由谷歌生成的app密码,而不是密码。首先,进入设置并启用两步验证。

然后点击App密码。

您应该看到应用程序密码屏幕。应用程序密码可以让你从不支持两步验证的设备上的应用程序登录到你的谷歌帐户。选择“邮件”作为应用程序,然后选择设备。在我的例子中,我选择了Other,因为我想将我的应用程序部署到云中。

完成后,单击GENERATE按钮。您将看到您生成的应用程序密码。

只需复制密码,并替换之前的密码在您的电子邮件发送服务生成的一个。不过,您将无法再次看到密码。

就是这样!

其他回答

您的代码似乎没有使用TLS (SSL),这是将邮件发送到谷歌(并使用端口465或587)所必需的。

你可以通过设置来做到这一点

$host = "ssl://smtp.gmail.com";

您的代码看起来很像这个示例,它在主机名方案中引用ssl://。

Set

'auth' => false,

另外,看看端口25是否工作。

I have a solution for GSuite accounts that doesnt have the "@gmail.com" sufix. Also I think it will work for GSuite accounts with the @gmail.com but havent tried it. First you should have the privileges to change the option "allos¿w less secure app" for your GSuite account. If you have the privileges (you can check in account settings->security) then you have to deactivate "two step factor authentication" go to the end of the page and set to "yes" for allow less secure applications. That's all. If you dont have privileges to change those options the solution for this thread will not work. Check https://support.google.com/a/answer/6260879?hl=en to make changes to "allow less..." option.

我尝试了@shasi kanth提供的建议,但没有奏效。我读了文档,做了一些改动。所以我设法通过Gmail使用这段代码发送邮件,其中vendor/autoload.php是由作曲家与作曲家要求“swiftmailer/swiftmailer:^6.0”:

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>

我不推荐Pear Mail。自2010年以来就没有更新过。还要读取源文件;源代码几乎过时了,是用php4风格写的,很多错误/ bug都被贴出来了(谷歌it)。我正在使用Swift Mailer。

Swift Mailer集成到任何用PHP 5编写的web应用程序中,提供了一种灵活而优雅的面向对象的方法来发送具有多种功能的电子邮件。

使用SMTP, sendmail, postfix或自定义传输发送电子邮件 实现你自己。 支持需要用户名和密码和/或加密的服务器。 在不剥离请求数据的情况下保护头部注入攻击 内容。 发送MIME兼容的HTML/多部分电子邮件。 使用事件驱动的插件来定制库。 处理内存较低的大型附件和内联/嵌入式图像 使用。

这是一个免费的开源软件,你可以下载Swift Mailer并上传到你的服务器上。(功能列表从所有者网站复制)。

Gmail SSL/SMTP和Swift Mailer的工作示例在这里…

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}