Laravel 9使用SMTP发邮件报错:sendmail进程连接意外关闭
问题描述(中文翻译)
我在Laravel 9版本中尝试使用Gmail和Outlook的SMTP发送邮件,但始终遇到以下错误:Connection to "process /usr/sbin/sendmail -bs" has been closed unexpectedly.
相关代码如下:
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Mail; class DiagnosticMail extends Mailable { use Queueable, SerializesModels; private $Data = []; /** * Create a new message instance. * * @param array $Data * @return void */ public function __construct(array $Data) { $this->Data = $Data; } /** * Build the message. * * @return $this */ public function build() { $data = [ 'subject' => 'Envoyer un email de test', 'body' => 'hello this is my mail' ]; return $this->view('scanners.emails') ->with($data) ->to('helahela@gmail.com', 'Destinataire') ->subject('first mail'); } }
问题原因
这个错误说明你的Laravel应用没有启用配置的SMTP驱动,而是默认调用了系统的sendmail程序,但sendmail可能未安装、配置错误或无运行权限。
解决步骤
1. 修正.env文件的邮件配置
打开项目根目录的.env文件,确保驱动设置为smtp,并填写对应邮箱的SMTP参数:
Gmail配置示例:
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=你的Gmail邮箱地址 MAIL_PASSWORD=Gmail应用专用密码(需开启两步验证后生成,不能用登录密码) MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=你的Gmail邮箱地址 MAIL_FROM_NAME="${APP_NAME}"
Outlook/Hotmail配置示例:
MAIL_MAILER=smtp MAIL_HOST=smtp.office365.com MAIL_PORT=587 MAIL_USERNAME=你的Outlook邮箱地址 MAIL_PASSWORD=你的Outlook登录密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=你的Outlook邮箱地址 MAIL_FROM_NAME="${APP_NAME}"
2. 清除配置缓存
修改.env后,必须清除Laravel配置缓存,确保新配置生效:
php artisan config:clear php artisan config:cache
3. 优化邮件类代码
你的DiagnosticMail类存在冗余逻辑,优化后更通用:
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class DiagnosticMail extends Mailable { use Queueable, SerializesModels; private $mailData = []; public function __construct(array $mailData) { $this->mailData = $mailData; } public function build() { return $this->view('scanners.emails') ->with($this->mailData) ->subject($this->mailData['subject'] ?? '测试邮件'); } }
发送邮件时指定收件人(保持邮件类的通用性):
use App\Mail\DiagnosticMail; use Illuminate\Support\Facades\Mail; $mailData = [ 'subject' => '测试邮件', 'body' => '这是我的测试邮件内容' ]; Mail::to('helahela@gmail.com', '收件人')->send(new DiagnosticMail($mailData));
4. 额外检查项
- 确认服务器防火墙/安全组开放了SMTP端口(587或465)
- Gmail必须开启两步验证并生成应用专用密码,普通密码无法用于SMTP服务
- 若不需要sendmail,可忽略相关安装,但确保.env中
MAIL_MAILER设为smtp
内容的提问来源于stack exchange,提问作者helen
相关产品推荐
相关产品推荐

