jstoone/nova-mailman
Nova Mailman brings database-backed email template management to Laravel Nova. Create and edit mailables, customize subjects and HTML/Markdown bodies, preview rendered emails, and send test messages from a clean Nova interface—no code changes needed for routine template updates.
composer update vendor/package
php artisan vendor:publish --tag=package-assets --force
php artisan config:clear && php artisan route:clear
config/...php) — for the enabled/middleware/gate keys and the storage driver.php artisan route:list | grep mail — confirm the new destroy route is registered and see exactly which middleware protects it.local, send a throwaway mail and confirm the full loop works end to end:
Mail::raw('hello', fn ($m) => $m->to('[email protected]')->subject('smoke test'));
Open the tool, verify the mail renders, check the new YYYY-MM-DD HH:MM:SS timestamp column, then use the new remove action and confirm the row disappears and the list refreshes without a page reload.enabled flag from an env var. The new destroy route makes this non-optional — a mail viewer is now a mail deleter.auth + role middleware) so the destroy endpoint isn't reachable by every authenticated user:
'middleware' => ['web', 'auth', 'can:viewMailTool'],
// app/Console/Commands/PruneMails.php
// iterate stale records and delete via the package's model/route
This is the cleanest way to keep the store from growing unbounded in staging.$this->delete(route('mail.destroy', $mail))->assertSuccessful();
$this->assertDatabaseMissing('mails', ['id' => $mail->id]);
YYYY-MM-DD HH:MM:SS, sort/filter server-side (or on the raw model attribute) rather than parsing the rendered string.npm run build), remove it — otherwise you'll be layering a fix on top of a fix and re-introducing the 500.config:cache in deployed environments. If config is cached, the new route and any changed middleware won't take effect until php artisan config:cache is re-run as part of your deploy."2 minutes ago"), any snapshot test of the index view, or any front-end code that parsed the old string will break. Grep for the old format before deploying.2024-05-01 09:00:00 is in whatever timezone the app renders in — confirm app.timezone matches what your team expects, otherwise debugging "when was this sent?" gets harder, not easier.config:clear, re-publish assets with --force, check storage/logs/laravel.log for a missing compiled CSS/JS manifest, then confirm the destroy route is present in route:list.How can I help you explore Laravel packages today?