binarybuilds/nova-mail-manager
Nova Mail Manager is a Laravel Nova tool for inspecting and managing emails sent by your app. Browse a searchable log of outgoing mail, preview rendered HTML, resend messages, and download attachments from a clean Nova interface.
Check compatibility before you run composer require. The last release is 2020‑08‑02, which puts this package in the Laravel 7/8 + Nova 3 era. Open the package's composer.json and confirm the laravel/nova constraint covers your installed version — on Nova 4/5 or Laravel 9+ (Symfony Mailer) expect breakage and budget for a fork. The MIT licence and small surface area make forking practical.
Minimal setup:
composer require binarybuilds/nova-mail-managerphp artisan vendor:publish (publish them separately so you can edit the migration before running it).php artisan migrate — this creates the table that stores sent‑mail snapshots.app/Providers/NovaServiceProvider.php:public function tools()
{
return [
new \BinaryBuilds\NovaMailManager\NovaMailManager(),
];
}
canSee on the tool or a Gate check) before it ever reaches production.Where to look first: the published config/nova-mail-manager.php (table name, queue, capture toggles), src/MailManager.php (the send/resend entry points), src/NovaMailManager.php (the UI), and the migration stub — the migration tells you exactly what is persisted (recipients, subject, HTML body, mailable class, serialized payload, attachments) and therefore what a resend can actually rebuild.
First use case: the "customer says they never got the invoice" ticket. Support opens Nova → Mail Manager, filters by recipient/subject/date, opens the record, hits Resend. No need to impersonate the user or replay the order flow. Wire only that mail path through the manager first, verify a resend lands in your provider's logs, then expand.
Mail::send in the app. Otherwise the table fills with marketing/newsletter traffic and the Nova index becomes useless.auth(), request(), or a session value will be wrong or null.invoice_sent_at column, a resend from Nova won't — decide whether that's acceptable or whether you need a small listener/observer.Invoice #1042 — Acme Ltd) and include the domain reference in the stored payload so support can search by order number rather than by email address.Mail::fake() in your application tests is unaffected; add one integration test asserting a record is written when the manager sends. In local dev, point MAIL_MAILER=log so resends go to storage/logs/laravel.log and you can diff the rendered output against the original before trusting the tool in production.ShouldQueue, the capture write happens in the worker. Verify the record is written on the queued path (not just the synchronous one), and keep an eye on long-running workers holding stale DB connections.src/ end-to-end before depending on it — it's small enough to audit in an afternoon.attachData()/attachFromStorage() frequently don't survive a round trip. Test resends for every mailable you register, attachments especially: know whether bytes are stored, and what happens when the source file has since been deleted.emails/mail_logs table; run php artisan config:cache after publishing, and php artisan optimize:clear if the tool doesn't appear in the sidebar after registration.How can I help you explore Laravel packages today?