我正在尝试使用 OAuth 进入 IMAP 服务器,使用由 Google 提供的PHP 示例代码,该代码使用 Zend Imap 类,但我无法进行身份验证。Zend 给了我错误:
Zend_Mail_Storage_Exception [ Error ]: cannot select INBOX, is this a valid transport?
令人讨厌的是,这是一个相当令人困惑的错误消息,因为本质上是“无效的凭据”。我怎么知道的?通过调试发送到 IMAP 套接字的实际命令,我看到了这一点:
string(44) "NO Invalid credentials ey9if1544983wid.142
"
我尝试过使用 telnet 和 Ruby gmail_xoauth gem,这表明这不是代码问题,而是其他问题。
查看所有这一切的最基本级别,我得到这样的命令:
TAG1 AUTHENTICATE XOAUTH R0VUIGh0dHBzOi8vbWFpbC5nb29nbGUuY29tL21h......etc
这就是我得到的地方NO Invalid credentials
:
TAG2 SELECT "INBOX"
这又回来BAD Unknown command
了,把我踢出去了。
我试过四处寻找有同样问题的人,但我只找到问题而没有答案。有几个类似的 StackOverflow 问题:
一篇文章显示有人在 Python 中遇到了完全相同的问题。
这篇文章展示了有人试图尴尬并使用 OAuth 2 来做这件事,但没有成功的报告。
GMail Google Group 上有一个帖子建议通过转到https://accounts.google.com/DisplayUnlockCaptcha的 GMail 帐户和https://www.google.com/a/来解决“无效凭据”错误[YOURDOMAIN.COM]/UnlockCaptcha如果您使用的是 Google Apps,但后者只是说我的用户名和密码错误,而他们显然不是。使用此https://accounts.google.com/DisplayUnlockCaptcha工作正常 - 即使我的帐户是托管应用程序,而不是普通的旧 GMail - 但是在尝试使用提供的 PHP 示例代码重新登录时,我仍然遇到相同的错误谷歌。
我尝试过使用各种托管的 Google App 帐户和一个普通的 GMail 帐户。我尝试将 IMAP 服务器从 imap.gmail.com 切换到 imap.googlemail.com,没有任何区别。
/**
* Make the IMAP connection and send the auth request
*/
$imap = new Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', true);
$authenticateParams = array('XOAUTH', $initClientRequestEncoded);
$imap->requestAndResponse('AUTHENTICATE', $authenticateParams);
/**
* Print the INBOX message count and the subject of all messages
* in the INBOX
*/
$storage = new Zend_Mail_Storage_Imap($imap);
echo '<h1>Total messages: ' . $storage->countMessages() . "</h1>\n";
对于那些感兴趣的人,这是设置连接的特定 PHP 代码,所有 XOauth 都由 Google 的 PHP 在同一个文件中处理,但我跳过了它。