返回

如何在 PHP-IMAP 中使用 OAuth 令牌连接 Office 365 IMAP?

php

使用 PHP-IMAP 和 OAuth 令牌建立 Office 365 IMAP 连接

摘要

建立 IMAP 连接时遇到困难?使用 PHP-IMAP 库和 OAuth 令牌连接到 Office 365 IMAP 服务器却失败了吗?本文将提供深入的解决方案,指导您解决此问题。

问题诊断

当你使用 OAuth 令牌作为密码并启用 SSL 加密和 OAuth 认证尝试建立连接时,PHP-IMAP 库可能会失败,而其他方法却有效。这通常是因为使用了不正确的授权方法。

解决方案

要解决此问题,请遵循以下步骤:

1. 注册应用程序

在 Azure 门户注册一个应用程序并设置重定向 URI 为 urn:ietf:wg:oauth:2.0:oob

2. 获取授权代码

通过浏览器中的以下 URL 获取授权代码:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id={client_id}&
response_type=code&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
scope=https://outlook.office.com/IMAP.AccessAsUser.All

3. 获取访问令牌

使用授权代码获取访问令牌:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id={client_id}
client_secret={client_secret}
redirect_uri=urn:ietf:wg:oauth:2.0:oob
code={authorization_code}
grant_type=authorization_code

4. 建立 IMAP 连接

将访问令牌用作密码建立 IMAP 连接:

$cm = new ClientManager();
$client = $cm->make([
    'host' => 'outlook.office365.com',
    'port' => 993,
    'encryption' => 'ssl',
    'validate_cert' => true,
    'protocol' => 'imap',
    'username' => $username,
    'password' => $access_token,
    'authentication' => "oauth2",
]);
$client->connect();

注意事项

  • 访问令牌的有效期为 1 小时。如果你需要在更长的时间内建立连接,你需要刷新令牌。
  • 对于生产环境,建议使用服务帐户,而不是个人用户帐户。

结论

遵循本文提供的步骤,你将能够使用 Webklex PHP-IMAP 库和 OAuth 令牌成功地建立到 Office 365 IMAP 服务器的连接。

常见问题解答

  1. 为什么 PHP-IMAP 在这种情况下会失败?
    PHP-IMAP 无法使用 OAuth2 客户凭据流来获取访问令牌。你需要使用 OAuth2 授权代码流。

  2. 访问令牌的有效期有多长?
    访问令牌的有效期为 1 小时。

  3. 如何刷新访问令牌?
    要刷新访问令牌,请使用刷新令牌调用 /token 端点。

  4. 为什么建议在生产环境中使用服务帐户?
    使用服务帐户可以减少安全性风险,并避免因用户密码泄露而导致的潜在数据泄露。

  5. 我可以使用此方法连接到其他 IMAP 服务器吗?
    此方法适用于所有支持 OAuth2 的 IMAP 服务器,包括 Office 365、Gmail 和 Yahoo Mail。