Laravel中使用OAuth通过Microsoft Outlook发邮件的认证问题
Laravel Outlook SMTP OAuth2认证失败解决办法
问题根源
Laravel默认SMTP驱动不支持直接将Access Token作为密码传入,Outlook的SMTP OAuth2需要特定认证机制,无法通过简单替换密码实现。
分版本解决方案
Laravel 9+(基于Symfony Mailer)
- 安装依赖包:
composer require symfony/oauth2-mailer symfony/http-client - 修改
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'), ], ], ], - 在
.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)
- 安装OAuth2相关依赖:
composer require league/oauth2-client swiftmailer/oauth2-transport - 修改
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') ); }, ], ], - 在
.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
相关产品推荐
相关产品推荐

