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校验失败。
修复方案
- 调整发件人逻辑:统一使用.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); });
- 补充配置映射:在
config/mail.php的配置数组中新增收件人配置项,避免直接在业务代码中读取环境变量:
// config/mail.php return 数组内新增 'recipient' => env('MAIL_RECIPIENT'),
- 调整邮件配置:优先使用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
- 刷新线上配置缓存:部署后执行以下命令使配置生效:
php artisan config:clear php artisan config:cache
- 若确实需要使用sendmail驱动,请先确认线上服务器已正确安装配置sendmail服务、25端口未被封禁,同时删除.env中多余的SMTP相关配置项即可。
内容的提问来源于stack exchange,提问作者eljulio
相关产品推荐
相关产品推荐

