Laravel配置SMTP发信至Office365企业邮箱无法收信问题咨询
问题成因
- 配置项存在冲突:当前配置同时设置
MAIL_MAILER=smtp和MAIL_DRIVER=sendmail,Laravel 7及以上版本优先读取MAIL_MAILER,旧版本读取MAIL_DRIVER,配置不一致会导致实际发信通道和预期不符。公共邮箱反垃圾校验规则宽松,异常发信也能送达;Office365对来源合法性校验极严,来源异常的邮件会被直接拦截。 - 发信来源合法性校验失败:你当前使用Yahoo公共SMTP代发邮件,Yahoo的SPF规则未授权第三方服务器代发@yahoo.com域名的邮件,Office365收到邮件后校验SPF/DKIM签名不通过,会直接判定为伪造/垃圾邮件,在网关层直接丢弃,不会进入用户收件箱甚至垃圾邮件文件夹,也不会发送退信通知。
- 发信IP信誉不足:Yahoo公共SMTP的出口IP经常被滥发垃圾邮件的用户占用,在Office365的IP信誉库中评分极低,从这类IP发出的邮件会被默认拒收。
- Mailtrap测试仅能验证Laravel邮件发送逻辑是否通顺,测试环境不会做公网真实场景下的反垃圾、域名校验,测试通过不代表公网正式发信可达。
解决方案
- 修正邮件配置,删除冲突项,停止使用个人公共邮箱SMTP发送业务邮件,二选一选择合规发信通道:
- 优先选择公司自有Office365邮箱作为发信账号,.env配置修改为如下内容,删除原配置里的
MAIL_DRIVER=sendmail项(Laravel 8+版本已废弃该配置项):
注意:使用Office365 SMTP前,需要企业管理员在Exchange后台开启对应账号的SMTP AUTH权限,否则会被服务器拒绝连接。MAIL_MAILER=smtp MAIL_HOST=smtp.office365.com MAIL_PORT=587 MAIL_USERNAME=对应企业邮箱账号@公司自有域名.com MAIL_PASSWORD=对应邮箱密码(如果账号开启了多因素认证,需要创建应用专用密码填写) MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=和MAIL_USERNAME一致的企业邮箱地址 MAIL_FROM_NAME="网站联系表单"- 如果不使用Office365发信,选择正规事务邮件服务发送,不要用个人公共邮箱SMTP,个人公共邮箱的服务条款本身禁止用于事务邮件代发,既容易被封号,也容易被收件方拦截。
- 优先选择公司自有Office365邮箱作为发信账号,.env配置修改为如下内容,删除原配置里的
- 完善域名DNS校验记录:在Cloudflare的DNS管理面板,为发信使用的域名添加正确的SPF、DKIM、DMARC记录,确保发信来源可被收件方信任。如果使用Office365自有域名发信,SPF记录值设置为
v=spf1 include:spf.protection.outlook.com -all即可;DKIM记录在Office365 Exchange管理中心生成对应值后添加到DNS;DMARC初始可设置为监控模式,值为v=DMARC1; p=none; rua=mailto:dmarc@公司自有域名.com。 - 配置生效验证:修改完.env后,在项目根目录执行两条命令清除Laravel缓存,避免旧配置生效:
php artisan config:clear php artisan cache:clear - 拦截排查:如果调整配置后仍然无法收到邮件,联系企业Office365管理员在Exchange管理中心打开邮件跟踪功能,查询对应发件人的邮件日志,可以直接看到邮件被拦截的具体原因(反垃圾策略触发、SPF校验失败、IP信誉不足等),对应调整即可。
内容的提问来源于stack exchange,提问作者Mohammad jadid
相关产品推荐
相关产品推荐

