使用OAUTH2和PHPMailer将SMTP发送到O365

qaxu7uf2  于 2022-11-21  发布在  PHP
关注(0)|答案(2)|浏览(301)

我 正在 转换 一 个 现有 的 PHPMailer 应用 程序 与 基本 ( 用户 名 和 密码 ) 身份 验证 使用 OAUTH2 。 安装 很 容易 , 但 应用 程序 失败 的 身份 验证 。

2020-05-23 15:14:59 Connection: opening to smtp.office365.com:587, timeout=300, options=array()
2020-05-23 15:14:59 Connection: opened
2020-05-23 15:14:59 SMTP INBOUND: "220 LO2P265CA0358.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sat, 23 May 2020 15:14:58 +0000"
2020-05-23 15:14:59 SERVER -> CLIENT: 220 LO2P265CA0358.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sat, 23 May 2020 15:14:58 +0000
2020-05-23 15:14:59 CLIENT -> SERVER: EHLO [my domain name]
2020-05-23 15:14:59 SMTP INBOUND: "250-LO2P265CA0358.outlook.office365.com Hello [91.208.99.2]"
2020-05-23 15:14:59 SMTP INBOUND: "250-SIZE 157286400"
2020-05-23 15:14:59 SMTP INBOUND: "250-PIPELINING"
2020-05-23 15:14:59 SMTP INBOUND: "250-DSN"
2020-05-23 15:14:59 SMTP INBOUND: "250-ENHANCEDSTATUSCODES"
2020-05-23 15:14:59 SMTP INBOUND: "250-STARTTLS"
2020-05-23 15:14:59 SMTP INBOUND: "250-8BITMIME"
2020-05-23 15:14:59 SMTP INBOUND: "250-BINARYMIME"
2020-05-23 15:14:59 SMTP INBOUND: "250-CHUNKING"
2020-05-23 15:14:59 SMTP INBOUND: "250 SMTPUTF8"
2020-05-23 15:14:59 SERVER -> CLIENT: 250-LO2P265CA0358.outlook.office365.com Hello [91.208.99.2]250-SIZE 157286400250-PIPELINING250-DSN250-ENHANCEDSTATUSCODES250-STARTTLS250-8BITMIME250-BINARYMIME250-CHUNKING250 SMTPUTF8
2020-05-23 15:14:59 CLIENT -> SERVER: STARTTLS
2020-05-23 15:14:59 SMTP INBOUND: "220 2.0.0 SMTP server ready"
2020-05-23 15:14:59 SERVER -> CLIENT: 220 2.0.0 SMTP server ready
2020-05-23 15:14:59 CLIENT -> SERVER: EHLO [my domain name]
2020-05-23 15:14:59 SMTP INBOUND: "250-LO2P265CA0358.outlook.office365.com Hello [91.208.99.2]"
2020-05-23 15:14:59 SMTP INBOUND: "250-SIZE 157286400"
2020-05-23 15:14:59 SMTP INBOUND: "250-PIPELINING"
2020-05-23 15:14:59 SMTP INBOUND: "250-DSN"
2020-05-23 15:14:59 SMTP INBOUND: "250-ENHANCEDSTATUSCODES"
2020-05-23 15:14:59 SMTP INBOUND: "250-AUTH LOGIN XOAUTH2"
2020-05-23 15:14:59 SMTP INBOUND: "250-8BITMIME"
2020-05-23 15:14:59 SMTP INBOUND: "250-BINARYMIME"
2020-05-23 15:14:59 SMTP INBOUND: "250-CHUNKING"
2020-05-23 15:14:59 SMTP INBOUND: "250 SMTPUTF8"
2020-05-23 15:14:59 SERVER -> CLIENT: 250-LO2P265CA0358.outlook.office365.com Hello [91.208.99.2]250-SIZE 157286400250-PIPELINING250-DSN250-ENHANCEDSTATUSCODES250-AUTH LOGIN XOAUTH2250-8BITMIME250-BINARYMIME250-CHUNKING250 SMTPUTF8
2020-05-23 15:14:59 Auth method requested: XOAUTH2
2020-05-23 15:14:59 Auth methods available on the server: LOGIN,XOAUTH2
2020-05-23 15:14:59 CLIENT -> SERVER: AUTH XOAUTH2 [long string of chars ending in == - base 64 encoded?] 
2020-05-23 15:15:04 SMTP INBOUND: "535 5.7.3 Authentication unsuccessful [LO2P265CA0358.GBRP265.PROD.OUTLOOK.COM]"
2020-05-23 15:15:04 SERVER -> CLIENT: 535 5.7.3 Authentication unsuccessful [LO2P265CA0358.GBRP265.PROD.OUTLOOK.COM]
2020-05-23 15:15:04 SMTP ERROR: AUTH command failed: 535 5.7.3 Authentication unsuccessful [LO2P265CA0358.GBRP265.PROD.OUTLOOK.COM]
SMTP Error: Could not authenticate.
2020-05-23 15:15:04 CLIENT -> SERVER: QUIT

中 的 每 一 个
我 的 composer.json 只是 :

"require": {
    "phpmailer/phpmailer": "~6.1",
    "stevenmaguire/oauth2-microsoft": "2.2.0"

格式
这 也 会 将 League oauth2 - client 和 其他 内容 拖 进来 。
为了 避免 OAUTH2 只 适用 于 免费 用户 帐户 而 不 适用 于 O365 的 问题 ( 参见 问题 3 - github 上 的 stevenmaguire/oauth2 - microsoft - 我 已经 复制 了 这个 问题 来 确认 它 ) , 我 对/src/Provider/Microsoft.php 进行 了 如下 编辑 :

protected $urlAuthorize = 'https://login.microsoftonline.com/common/oauth2/authorize';
  protected $urlAccessToken = 'https://login.microsoftonline.com/common/oauth2/token';

格式
(This使用 Graph V1 终结 点 。 请 注意 , 最 新 的 Graph 终结 点 V2 是 通过 ... oauth2/v2.0/token 和 ...oauth2/v2.0/authorize 访问 的 , 并且 这 两 个 终结 点 使用 的 Scope 参数 与 旧 的 " wl " Windows Live 终结 点 不 兼容 )
第 一 个
我 的 get_oauth_token.php 包含 :

$clientId = [my client ID];
$clientSecret = [my client secret]';
$redirectUri = [the full URI of get_oauth_token.php];

格式
我 在 MSFT Azure AD 中 创建 了 一 个 " Web 应用 " 类型 的 应用 , 从 那里 获取 了 客户 端 ID 和 客户 端 密码 , 并 为 SMTP . Send 、 Mail . Send 、 offline _ access 和 openid 添加 了 API 权限
如果 我 能 在 代码 中 找到 Azure AD 身份 验证 代码 和 消息 ( 参见 https ://learn . microsoft . com/en-us/azure/active-directory/develop/reference-aadsts - error-codes # lookup-current - error-code - information ) 的 返回 位置 , 我 将 向前 迈进 一 步 ! 我 已 尝试 使用 AD 监视 器 进行 登录 , 但 这些 特定 的 不 成功 尝试 没有 被 记录 - 也 没有 成功 获取 刷新 令牌 。

13z8s7eq

13z8s7eq1#

$mail = new PHPMailer;
    $mail->isSMTP();                           // Set mailer to use SMTP
    $mail->Host = 'smtp.office365.com';        // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                    // Enable SMTP authentication
    $mail->AuthType = 'LOGIN';               // omit this to send using basic authentication
   
    $mail->Username = 'sdfdsfds@outlook.com';                  // SMTP username – not needed for OAUTH2
    $mail->Password = 'fdssdf';                  // SMTP password – not needed for OAUTH2
    $mail->SMTPSecure = 'starttls';                 // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;  
    $mail->SMTPDebug = SMTP::DEBUG_LOWLEVEL;

小心使用phpmailer,我使用是5.2,在class.smtp中,它对用户邮件编码两次,所以我的解决方案是在以下情况下删除base64_encode:

case 'LOGIN':
                // Start authentication
                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
                    return false;
                }
                if (!$this->sendCommand("Username", ($username), 334)) {
                    return false;
                }
                if (!$this->sendCommand("Password", base64_encode($password), 235)) {
                    return false;
                }
                break;
tjjdgumg

tjjdgumg2#

这个问题最终被追溯到MSFT对OIDC/OAuth2身份验证的古怪实现,我从Stackoverflow和其他地方的帖子中了解到这一点,这让许多开发人员感到困惑。实际上,MSFT并没有完成这项工作。我在https://github.com/decomplexity/SendOauth2/blob/main/MSFT%20OAuth2%20quirks.md中详细描述了这一点--以及解决方案

相关问题