asignua/filament-mail-log
A Filament plugin that records outgoing emails in your database and gives you a browsable log inside the admin panel, so you can inspect messages, recipients, and content without digging through server mail logs.
resendMailLog gate / MailLogPlugin::authorizeResend(), closed by default — but the product decision is yours: who holds that permission, is it a distinct role from "view mail log", and do you require a ticket reference or second approval for high-risk templates (password reset, magic links)??email= on reset links as personal data rather than a secret. New wrinkle: v1.1.0's confirmation modal explicitly warns when secrets were stripped from the stored copy (signed links will be broken) or the body was truncated. That warning is a symptom of a policy choice — if your redaction patterns are aggressive, resend becomes unreliable for exactly the highest-value templates. Ratify the policy, then decide whether resend should be disabled for redacted rows.resent_from_id, with "Resent from #id" / "Resent N times" on the message page. What remains open is customer-facing self-service and a true per-user delivery timeline. Treat this as evidence the maintainer ships workflow features, not just fixes.resend.mailer lets you route resends through a different transport, so you must choose whether resends should be visible to your ESP's analytics/suppression logic or deliberately isolated from it; (2) the package does not check suppression — a resend to a hard-bounced address is possible. Also note the modal states attachments are not resent (only names are stored), so "resend the invoice" will arrive without the invoice. Both are support-script requirements, not code defects./email/verify/[REDACTED]/{hash} left the secret hash visible while hiding the harmless id) — any deployment on an earlier tag is still a mandatory upgrade. v1.1.0 raises the operational bar in a good way: the resend action is hidden until the add_resent_from_id_to_mail_logs_table migration is published and run, and logging degrades gracefully to prior behavior. That is a mature rollout pattern and a reason to trust the release process, but it means your deploy runbook must include the migration or the feature silently won't exist.Adopt when:
Look elsewhere when:
?email= is retained by default.For executives: A small, focused dependency that gives support staff a safe view of the e-mails we send customers — and, as of v1.1.0, the ability to re-send them without escalating to engineering. That closes a recurring time-to-resolution gap on login and verification tickets and gives us a written record of who re-sent what, to whom, and from which original message. It is privacy-conscious by design (secrets masked in stored links) and the new send capability is off by default behind its own permission. The 1.0.1 security patch fixed a genuine leak where verification hashes could stay readable in the admin panel, so anyone already running an earlier version should upgrade now; for new adopters this remains a low-risk, single-purpose dependency.
For engineering: Drop-in for Laravel + Filament. Upgrade path matters: publish and run add_resent_from_id_to_mail_logs_table — until then the resend action is simply hidden and logging behaves as before, so the migration is a feature gate, not a breaking change. The Resend action is closed by default behind resendMailLog / MailLogPlugin::authorizeResend(), separate from the view permission; wire it into a distinct role. Config: resend.enabled, resend.mailer (choose deliberately — routing resends through a different transport changes your ESP analytics and suppression behavior), resend.queue (async sends — monitor the queue). Known limits to document in the support runbook: the modal warns when redaction or truncation has broken signed links, attachments are never resent (only names stored), and there is no bounce/suppression check. The v1.0.1 preview-iframe fix (Tailwind classes Filament doesn't ship → inline styles, light and dark) and corrected prefix redaction (all trailing segments, not just the first) still apply; ?email= on reset links remains intentionally retained as personal data — add a redaction.patterns entry if policy says otherwise. Gate the panel behind authorization and pin the version.
How can I help you explore Laravel packages today?