Files
Twyco a0467592fa
tests / ci (push) Failing after 1m54s
CI/CD / test_and_check_app (push) Failing after 2m44s
CI/CD / Publish immutable image (push) Skipped
lint & install nightwatch
2026-08-24 21:17:12 +02:00

1.2 KiB

Mail Best Practices

Implement ShouldQueue on the Mailable Class

Makes queueing the default regardless of how the mailable is dispatched. No need to remember Mail::queue() at every call site — Mail::send() also queues it.

Use afterCommit() on Mailables Inside Transactions

A queued mailable dispatched inside a transaction may process before the commit. Use $this->afterCommit() in the constructor.

Use assertQueued() Not assertSent() for Queued Mailables

Mail::assertSent() only catches synchronous mail. Queued mailables fail assertSent with a "Did you mean to use assertQueued()?" hint.

Incorrect: Mail::assertSent(OrderShipped::class); when mailable implements ShouldQueue.

Correct: Mail::assertQueued(OrderShipped::class);

Use Markdown Mailables for Transactional Emails

Markdown mailables auto-generate both HTML and plain-text versions, use responsive components, and allow global style customization. Generate with --markdown flag.

Separate Content Tests from Sending Tests

Content tests: instantiate the mailable directly, call assertSeeInHtml(). Sending tests: use Mail::fake() and assertSent()/assertQueued(). Don't mix them — it conflates concerns and makes tests brittle.