Laravel通过Office 365发邮件遇550权限错误,求Office 365配置方案
这个问题我帮好几个开发者排查过,本质是Office 365的发送权限限制和Laravel的配置细节没匹配上,我给你一步步梳理可行的解决办法:
先搞懂错误原因
你看到的Client does not have permissions to send as this sender 550错误,核心是Office 365不允许你的应用用当前配置的发件人邮箱发送邮件——要么是SMTP验证账号和发件人不一致,要么是账号没开SMTP权限,或者是开启了MFA却用了原密码。
方案1:确保发件人邮箱和SMTP用户名完全一致
Office 365的SMTP服务有个硬性要求:用来做SMTP验证的账号(也就是MAIL_USERNAME)必须和你设置的发件人邮箱完全相同。比如你的MAIL_USERNAME是support@yourdomain.com,那Laravel里的发件地址也得是这个,不能用admin@yourdomain.com之类的其他邮箱。
你可以直接在.env里添加一行统一配置:
MAIL_FROM_ADDRESS=your-full-email@yourdomain.com # 这个值要和MAIL_USERNAME完全一样 MAIL_FROM_NAME="你的应用名称"
方案2:开启账号的Authenticated SMTP权限
默认情况下,部分Office 365商业版/教育版账号会关闭“Authenticated SMTP”权限,导致第三方应用没法通过SMTP发邮件。你可以通过两种方式开启:
方式A:通过Microsoft 365管理中心操作
- 登录Microsoft 365 Admin Center,找到对应的用户邮箱
- 进入「邮件」选项卡,找到「电子邮件应用」设置
- 确保「Authenticated SMTP」处于开启状态(如果是灰色无法修改,就用下面的PowerShell方法)
方式B:用PowerShell命令开启
打开PowerShell,执行以下命令(需要先安装Exchange Online模块):
# 连接到Exchange Online Connect-ExchangeOnline # 给指定账号开启SMTP权限 Set-CASMailbox -Identity "your-full-email@yourdomain.com" -SmtpClientAuthenticationDisabled $false
执行完后等待15-30分钟让配置生效。
方案3:如果开启了MFA,必须用应用密码
如果你的Office 365账号开启了多因素认证(MFA),直接用原账号密码作为MAIL_PASSWORD肯定会失败,这时候需要生成应用密码:
- 登录该用户的Microsoft账户,进入「安全」选项卡
- 找到「应用密码」选项,生成一个新的应用密码
- 把这个应用密码填到
.env的MAIL_PASSWORD字段里,替换原账号密码
方案4:检查Laravel版本适配的配置细节
如果你的Laravel是9及以上版本,注意MAIL_DRIVER已经被弃用,要改成MAIL_MAILER,完整的.env配置应该是这样:
MAIL_MAILER=smtp MAIL_HOST=smtp.office365.com MAIL_PORT=587 MAIL_USERNAME=your-full-email@yourdomain.com MAIL_PASSWORD=your-app-password-or-normal-password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=your-full-email@yourdomain.com MAIL_FROM_NAME="你的应用名称"
测试配置是否生效
可以写个简单的测试路由快速验证:
Route::get('/test-office365-mail', function () { try { \Illuminate\Support\Facades\Mail::raw('这是Laravel通过Office 365发送的测试邮件', function ($message) { $message->to('你的测试邮箱@example.com') ->subject('Office 365 SMTP测试'); }); return '邮件发送成功!'; } catch (\Exception $e) { return '发送失败:' . $e->getMessage(); } });
访问这个路由,就能快速知道配置是否正确了。
内容的提问来源于stack exchange,提问作者Einsamer

