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

Laravel 8线上sendmail发信报221 2.7.0错误如何解决

错误触发原因
  • 核心原因是发件人规则校验不通过:你代码中直接将用户提交的外部邮箱作为邮件from发件人参数,线上服务器的SMTP服务默认开启了发件人域名校验,要求发件人必须和服务器绑定的合法发件域名一致,该操作触发反垃圾规则,SMTP服务主动断开连接返回对应错误。
  • 配置冲突:你同时配置了MAIL_MAILER=sendmail和SMTP相关的MAIL_HOST、MAIL_PORT参数,若线上服务器未正确安装配置sendmail服务,或是云厂商默认封禁了25端口,也会触发连接异常。
  • 环境变量读取异常:Laravel 8执行config:cache配置缓存后,直接调用env()函数会返回null,你代码中直接用env('MAIL_RECIPIENT')读取收件人地址,若线上开启了配置缓存,会导致收件人为空触发SMTP校验失败。
修复方案
  1. 调整发件人逻辑:统一使用.env中配置的合法发件地址作为发件人,用户的联系邮箱放到replyTo参数中,保证回复邮件时可直接发送到用户邮箱,代码调整如下:
Mail::raw($message, function ($message) use ($toName, $toEmail, $subject) {
    $message->to(config('mail.recipient'))
            ->subject('Anfrage über das Kontaktformular')
            ->from(config('mail.from.address'), config('mail.from.name'))
            ->replyTo($toEmail, $toName);
});
  1. 补充配置映射:在config/mail.php的配置数组中新增收件人配置项,避免直接在业务代码中读取环境变量:
// config/mail.php return 数组内新增
'recipient' => env('MAIL_RECIPIENT'),
  1. 调整邮件配置:优先使用SMTP驱动替代sendmail,避免线上服务配置/权限问题,推荐使用587端口走TLS加密绕开25端口封禁,.env调整示例如下:
MAIL_MAILER=smtp
# 替换为实际使用的邮件服务商SMTP地址
MAIL_HOST=smtp.example.de
MAIL_PORT=587
# 替换为发件账号的用户名、密码
MAIL_USERNAME=no-reply@example.de
MAIL_PASSWORD=你的发件账号密码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=no-reply@example.de
MAIL_FROM_NAME="Example website contact form"
MAIL_RECIPIENT=my@email.de
  1. 刷新线上配置缓存:部署后执行以下命令使配置生效:
php artisan config:clear
php artisan config:cache
  1. 若确实需要使用sendmail驱动,请先确认线上服务器已正确安装配置sendmail服务、25端口未被封禁,同时删除.env中多余的SMTP相关配置项即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:24:01