You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用OAuth通过Microsoft Outlook发邮件的认证问题

Laravel Outlook SMTP OAuth2认证失败解决办法

问题根源

Laravel默认SMTP驱动不支持直接将Access Token作为密码传入,Outlook的SMTP OAuth2需要特定认证机制,无法通过简单替换密码实现。

分版本解决方案

Laravel 9+(基于Symfony Mailer)

  1. 安装依赖包:
    composer require symfony/oauth2-mailer symfony/http-client
    
  2. 修改config/mail.php,新增或修改outlook邮件驱动配置:
    'mailers' => [
        'outlook' => [
            'transport' => 'outlook',
            'client_id' => env('OUTLOOK_CLIENT_ID'),
            'client_secret' => env('OUTLOOK_CLIENT_SECRET'),
            'refresh_token' => env('OUTLOOK_REFRESH_TOKEN'),
            'tenant_id' => env('OUTLOOK_TENANT_ID'),
            'from' => [
                'address' => env('MAIL_FROM_ADDRESS'),
                'name' => env('MAIL_FROM_NAME'),
            ],
        ],
    ],
    
  3. 在.env配置环境变量:
    MAIL_MAILER=outlook
    OUTLOOK_CLIENT_ID=你的Azure应用客户端ID
    OUTLOOK_CLIENT_SECRET=你的Azure应用客户端密钥
    OUTLOOK_REFRESH_TOKEN=获取到的刷新令牌
    OUTLOOK_TENANT_ID=你的Azure租户ID
    MAIL_FROM_ADDRESS=你的Outlook邮箱地址
    MAIL_FROM_NAME=发件人显示名称
    

Laravel 8及以下(基于SwiftMailer)

  1. 安装OAuth2相关依赖:
    composer require league/oauth2-client swiftmailer/oauth2-transport
    
  2. 修改config/mail.php的SMTP配置,添加OAuth2认证逻辑:
    'mailers' => [
        'smtp' => [
            'driver' => 'smtp',
            'host' => 'smtp-mail.outlook.com',
            'port' => 587,
            'encryption' => 'tls',
            'username' => env('MAIL_USERNAME'),
            'auth_mode' => 'oauth',
            'oauth_provider' => function () {
                $provider = new \League\OAuth2\Client\Provider\GenericProvider([
                    'clientId' => env('OUTLOOK_CLIENT_ID'),
                    'clientSecret' => env('OUTLOOK_CLIENT_SECRET'),
                    'urlAuthorize' => 'https://login.microsoftonline.com/' . env('OUTLOOK_TENANT_ID') . '/oauth2/v2.0/authorize',
                    'urlAccessToken' => 'https://login.microsoftonline.com/' . env('OUTLOOK_TENANT_ID') . '/oauth2/v2.0/token',
                    'urlResourceOwnerDetails' => '',
                ]);
                return new \SwiftMailer\OAuth2\OAuth2Provider(
                    $provider,
                    env('OUTLOOK_CLIENT_ID'),
                    env('OUTLOOK_CLIENT_SECRET'),
                    env('OUTLOOK_REFRESH_TOKEN')
                );
            },
        ],
    ],
    
  3. 在.env配置对应变量:
    MAIL_MAILER=smtp
    MAIL_USERNAME=你的Outlook邮箱地址
    OUTLOOK_CLIENT_ID=你的Azure应用客户端ID
    OUTLOOK_CLIENT_SECRET=你的Azure应用客户端密钥
    OUTLOOK_REFRESH_TOKEN=获取到的刷新令牌
    OUTLOOK_TENANT_ID=你的Azure租户ID
    

重要注意事项

  • 禁止直接使用短期Access Token替代密码,必须使用Refresh Token实现自动续期
  • 确保Azure AD应用已配置SMTP.Send(Delegated)权限,且完成授权流程获取到有效Refresh Token
  • 核对租户ID、客户端ID、密钥等参数,确认授权邮箱拥有邮件发送权限

内容的提问来源于stack exchange,提问作者Gurwinder Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:30:53