通过 PHPMailer 发送电子邮件时出现身份验证错误

Posted

技术标签:

【中文标题】通过 PHPMailer 发送电子邮件时出现身份验证错误【英文标题】:Authentication Error while sending email via PHPMailer 【发布时间】:2016-07-27 19:10:13 【问题描述】:

以下是我用于使用 phpMailer 发送邮件但出现错误的代码。

 public function changePassword()
   if($this->request->is('post'))
   require_once(ROOT .DS. 'vendor' . DS  . 'PHPMailer' . DS .  'class.phpmailer.php');
   $email = 'abc@gmail.com';
   $mail = new PHPMailer(); // create a new object
   $mail->IsSMTP(); // enable SMTP
   $mail->ishtml(true);
   $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
   $mail->SMTPAuth = true; // authentication enabled
   $mail->SMTPSecure = 'TLS'; // secure transfer enabled REQUIRED for Gmail
   $mail->Host = "smtp.gmail.com";
   $mail->Port = 587; // or 587
   $mail->IsHTML(true);
   $mail->Username = "xyz@gmail.com";
   $mail->Password = "dead_gone";
   $mail->SetFrom("xyz@gmail.com");
   $mail->AddAddress($email);
   $mail->Subject = "password recovery";
   $mail->Body = "your password is:- sdx_12345  click here to log in <a href ='http://localhost/cake/logins'> click here  </a>  ";

   if(!$mail->Send()) 
     echo "Mailer Error: " . $mail->ErrorInfo;
    else 
       echo "mail sent";
     
 

错误:

SMTP -> 错误:服务器不接受 AUTH:530 5.7.0 必须先发出 STARTTLS 命令。 v3sm8416695par.17 - gsmtp SMTP 错误:无法验证。邮件程序错误:SMTP 错误:无法验证。

【问题讨论】:

【参考方案1】:

此属性区分大小写:

$mail->SMTPSecure = 'tls'

如果您的代码基于 the gmail example provided with PHPMailer,这会有所帮助 - 这并不是说您是第一个连接到 gmail 的人!

【讨论】:

通过在 gmail 中打开允许不太安全的应用访问您的帐户选项解决了这个问题。 这是不合理的:为不太安全的应用程序启用访问将无法解决Must issue a STARTTLS。它可能会解决一个完全不同的问题,如 the PHPMailer docs 所述,但这不是您提出的问题。 将TLS更改为tls后出现未授权访问的错误。 我知道你做了,但它仍然与你提出的问题无关。想象一下有人阅读了这个问题并看到了您的评论 - 他们会认为启用安全性较低的应用程序可以解决 STARTTLS 问题,但事实并非如此。 说真的,我没有发出任何 STARTTLS 命令。实施您的解决方案并启用启用不太安全的应用程序。它在我的情况下有效。并不是说这是完美的解决方案。【参考方案2】:

尝试通过端口 465 进行 SSL 连接,然后从 google 查看您帐户中的安全设置

【讨论】:

不,不要。自 1998 年以来,465 上的 SSL 已被弃用。【参考方案3】:

你也应该放

$mail->IsHTML(true);

在你设置好你的身体和附件之后。

编辑:

TLS 也可能必须是小写的。

【讨论】:

我投了反对票,因为 $mail->IsHTML(true);已经存在于函数体中,问题不在于 html 的设置。 是的,但是在错误的位置。他必须在 $mail->Body() 方法下设置它以避免出现问题。见***.com/a/16256464/5230497。这也是一个建议。 设置在哪里都没关系。一次就够了,之前就好。 你认为这真的很重要吗?无论如何你可以把它作为评论而不是作为答案。 是的,这很重要,因为一些邮件服务器倾向于拒绝包含错误/格式错误/没有内容的邮件

以上是关于通过 PHPMailer 发送电子邮件时出现身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章

将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件

使用PHPMailer发送邮件

使用php发送电子邮件(phpmailer)

PHP 通过PHPMailer发送邮件

PHP 通过PHPMailer发送邮件

尝试通过电子邮件发送多个附件时出现 ActivityNotFoundException