Files
City10/.claude/skills/laravel-best-practices/rules/mail.md
T
marcocosta10000 79ce2a1825 feat(world): add persistent citizen simulation with needs, jobs, and social features
- Adds Character model with survival needs (hunger, thirst, energy) and state machine
- Implements city:tick world ticker for offline progression every minute
- Adds city territory expansion and building construction system
- Introduces job economy, inventory, and transaction audit trail
- Adds social graph (friends, marriage, children) and character chat
- Implements admin approval workflow for new registrations
- Adds hospital admission system for traffic accidents
- Includes comprehensive feature tests and world seeders
2026-10-17 21:46:23 -03:00

1.9 KiB

Mail Best Practices

Queue Slow Mail Delivery

Implement ShouldQueue on a mailable when delivery should normally happen in the background. Laravel queues that mailable even when the call site uses Mail::send().

class OrderShipped extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;
}

Keep mail synchronous when the caller must know immediately whether delivery was accepted, or when no queue worker is available.

Dispatch Queued Mail After Commit

A queued mailable dispatched during a database transaction can be processed before the transaction commits. Call afterCommit() on the mailable, or enable the queue connection's after_commit option, when the mail depends on committed records.

Mail::to($user)->send(
    (new OrderShipped($order))->afterCommit()
);

If the transaction rolls back, an after-commit mailable is not dispatched. This setting affects queued mail only; it does not defer synchronous delivery.

Assert the Delivery Mode

Use Mail::assertQueued() for queued mailables and Mail::assertSent() for synchronously sent mailables.

Incorrect for a mailable that implements ShouldQueue:

Mail::assertSent(OrderShipped::class);

Correct:

Mail::assertQueued(OrderShipped::class);

Use Markdown Mailables When They Fit

Markdown mailables render HTML and plain-text versions from Laravel's mail components and support publishable themes. They are useful for conventional transactional messages, but a custom HTML and text pair may be more appropriate for a specialized design.

php artisan make:mail OrderShipped --markdown=mail.orders.shipped

Separate Content and Delivery Tests

Test rendered content by instantiating the mailable and using assertions such as assertSeeInHtml() and assertSeeInText(). Test delivery separately with Mail::fake() and assertSent() or assertQueued() so failures identify the affected behavior.