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

Laravel 10+LiveWire3用Mailtrap发邮件时出现空值数组偏移错误

问题:Laravel 10 + LiveWire 3 发送Mailtrap邮件时出现数组偏移错误

环境与代码

LiveWire组件代码

<?php

namespace App\Livewire\Inbox;

use Livewire\Attributes\Title;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Illuminate\Support\Facades\Mail;
use App\Mail\ComposeMail;

#[Title('Email Compose')]
class Compose extends Component
{
    #[Validate('required|email')]
    public $to;
    #[Validate('required|string|max:255')]
    public $subject;
    #[Validate('required|string')]
    public $message;

    public function send()
    {
        $this->validate();

        if(!is_null($this->to)){
            Mail::to($this->to)->send(new ComposeMail($this->subject, $this->message));
        }


        session()->flash('success', 'Mail sended successfully');
    }

    public function render()
    {
        return view('livewire.inbox.compose');
    }
}

Mailable类代码

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use Illuminate\Mail\Mailables\Address;

class ComposeMail extends Mailable
{
    use Queueable, SerializesModels;

    public $subject;
    public $messages;

    /**
     * Create a new message instance.
     */
    public function __construct($subject, $messages)
    {
        $this->subject = $subject;
        $this->messages = $this->sanitizeMessage($messages);
    }

    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            from: new Address('john0@gmail.com', 'john'),
            subject: 'testing',
        );
    }
    
    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'mails.send',
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }

    private function sanitizeMessage($message): string
    {
        return htmlentities($message);
    }
}

Blade视图代码

<h1>mail sent</h1>

.env配置

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=6c9158bd41cb6e
MAIL_PASSWORD=********686d
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="john@gmail.com"

错误信息

ErrorException
PHP 8.2.12
10.43.0
Trying to access array offset on value of type null
错误指向代码行:Mail::to($this->to)->send(new ComposeMail($this->subject, $this->message));

原因分析

  • .env配置解析异常:MAIL_FROM_ADDRESS使用了双引号,Laravel读取配置时可能解析为null,导致邮件构建过程中触发数组偏移错误。
  • Mailable逻辑冲突:envelope()方法硬编码了subject值,同时构造函数又赋值了$this->subject,加上from地址与.env配置不一致,引发底层逻辑异常。
  • 冗余判断无意义:LiveWire的验证规则已经确保$this->to不为空,if(!is_null($this->to))属于冗余代码,虽不直接引发错误,但可能掩盖其他问题。

解决方案

1. 修正.env配置

移除MAIL_FROM_ADDRESS的双引号,补充MAIL_FROM_NAME(若缺失):

MAIL_FROM_ADDRESS=john@gmail.com
MAIL_FROM_NAME="john"

执行配置缓存清除:

php artisan config:clear

2. 修复Mailable的Envelope逻辑

让from地址读取.env配置,subject使用构造函数传入的值:

public function envelope(): Envelope
{
    return new Envelope(
        from: new Address(config('mail.from.address'), config('mail.from.name')),
        subject: $this->subject,
    );
}

3. 移除冗余空值判断

LiveWire验证已确保$this->to有效,直接保留发送代码:

Mail::to($this->to)->send(new ComposeMail($this->subject, $this->message));

4. 验证Mailtrap凭据

确认MAIL_USERNAME和MAIL_PASSWORD与Mailtrap控制台提供的完全一致,无截断或输入错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:27:02