PHPMailer SMTP Gmail身份验证错误

时间:2015-05-12 08:31:32

标签: oauth-2.0 smtp gmail phpmailer

我正在使用PHPMailer 5.2.10发送电子邮件,其中包含下一个代码:

function SendGmail($to,$subj,$body)
{
    $mail = new PHPMailer(); // create a new object
    $mail->IsSMTP(); // enable SMTP
    $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
    $mail->SMTPAuth = true; // authentication enabled
    $mail->SMTPSecure = 'ssl'; // "ssl" secure transfer enabled REQUIRED for GMail
    $mail->Host = "smtp.gmail.com";
    $mail->Port = 465; // 465 or 587
    $mail->IsHTML(true);
    $mail->Username = "admin@mydomain.ru";
    $mail->Password = "********";
    $mail->SetFrom("admin@mydomain.ru");
    $mail->Subject = $subj;
    $mail->Body = $body;
    $mail->AddAddress($to);
    return $mail->Send();
}

注意:我们使用Google Apps,因此邮件域不是google.com,而是其他一些,比方说,mydomain.ru。

在Google最近实施了另一项“安全增强” (AFAIK强制OAuth2授权)之前,一切都很顺利。现在PHPMailer-> Send()返回以下文本:

2015-05-12 06:49:15 CLIENT -> SERVER: EHLO 127.0.0.1 
2015-05-12 06:49:15 CLIENT -> SERVER: AUTH LOGIN 
2015-05-12 06:49:15 CLIENT -> SERVER: [some base64 string] 
2015-05-12 06:49:15 CLIENT -> SERVER: [some base64 string] 
2015-05-12 06:49:16 SMTP ERROR: Password command failed: 535-5.7.8 Username and Password not accepted. Learn more at 535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 u10sm3566045lbb.30 - gsmtp 
2015-05-12 06:49:16 SMTP Error: Could not authenticate. 
2015-05-12 06:49:16 CLIENT -> SERVER: QUIT 
2015-05-12 06:49:16 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting bool(false) Done!

好的,我转到http://support.google.com/mail/bin/answer.py?answer=14257并执行以下操作:

  

访问不太安全的应用:*关闭/ *启用” - 对于普通的Gmail帐户,

     

(“此设置无法访问谷歌应用帐户”) - 对于谷歌应用程序帐户(不是确切的文本,但我的翻译来自俄罗斯,谷歌显示它。)

是的,我已尝试过SSL和TLS,485或587端口以及我在stackoverflow.com和此处发现的所有其他内容: https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting。什么都没有帮助。

PHPMailer故障排除页面建议使用“OAuth2客户端类”:http://www.phpclasses.org/package/7700-PHP-Authorize-and-access-APIs-using-OAuth.html - 但我不知道如何将其集成到PHPMailer中以及PHPMailer开发人员尚未集成它的原因(此类是在BSD许可下) ),现在有必要为一个最流行的邮件服务器。我没有找到关于将它集成到PHPMailer中的OAuth2的文档,我确信我自己也做不到 - 我的PHP知识很差。

问题是:

  1. 如何避免这个该死的OAuth2并发送电子邮件,就像我在“安全增强”(谷歌应用程序帐户的之前所做的那样?的 - OR:

  2. 如何轻松地将上面提到的OAuth2类集成到PHPMailer中?的 - OR:

  3. 是否还有其他易于使用的PHP解决方案来使用Gmail发送电子邮件?

  4. 提前多多感谢。

3 个答案:

答案 0 :(得分:2)

感谢您阅读文档,非常感谢!问题在于谷歌已经强加了这种复杂的身份验证机制,而没有像你所经历的那样过多地关注它的用户。它不会提高安全性,因为最终您仍需要通过SSL提交用户名和密码才能获得令牌。 OAuth是授权(你可以做什么)协议,但谷歌间接使用它作为身份验证(你是谁)协议。

没有人实施它的原因是虽然它非常聪明,但OAuth通常会让人感到不愉快和难以理解,这就是为什么如果有人开始实施它就会感到非常高兴!

This article非常有用,可能构成PHPMailer实现的基础。虽然这增加了对ZF2的依赖性,但其他任何OAuth实现的原则都是相同的,例如我链接到的{或this one的PHPClasses。

对不起,我对此没什么帮助。

更新:PHPMailer现在支持OAuth for gmail。 This article描述了如何使用它,是的,它仍然非常不愉快!

答案 1 :(得分:1)

  

我怎样才能避免这个该死的OAuth2并发送电子邮件   在此之前"安全性增强" (对于谷歌应用程序帐户)?

你不能。与常规Google,Google Apps does not allow"不太安全的应用"不同。一旦您的帐户被标记为额外的安全性,您必须切换到OAuth2。

  

如何轻松地将上面提到的OAuth2类集成到PHPMailer中?

你不能。像Thunderbird团队一样,有一些非常强大的bias against OAuth2 in the PHP Mailer team。 IMO,OAuth2是电子邮件的重大改进。

  

是否还有其他易于使用的PHP解决方案来发送电子邮件   使用gmail?

是。我自己的SMTP项目Postman的解决方案是从PHP Mailer切换到Zend_Mail for OAuth2。 Zend_Mail已经支持原生OAuth2了很长一段时间。

答案 2 :(得分:0)

哎呀,这是我的错误,我一直在错误的地方编辑代码,而不是在执行它的那个代码。

奇怪,但是尽管OAuth2和其他谷歌惊喜,我还是没有改变任何东西来使旧代码工作(只是更新密码)。