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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:11