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
相关产品推荐
相关产品推荐

