finity-labs/fin-mail
FinMail adds an email template manager and composer to Filament. Create dynamic, multilingual templates with token replacement and merge tags, version templates, log sent emails with status tracking, override auth mails, and use a reusable “Send Email” action in resources.
MissingSettings exception during artisan boot when scheduled cleanup is registered before the fin-mail-logging settings have been migrated. The catch around app(LoggingSettings::class) didn't cover the lazy property access that actually triggers the load, so the exception escaped and broke package:discover and fin-mail:install in some setups (#13, thanks @devrizzz)spatie/laravel-settings is now mentioned explicitly in the README as an auto-installed dependencyFull Changelog: https://github.com/finity-labs/fin-mail/compare/v1.7.0...v1.7.1
Preview, SendTest, Compose (Email Templates) and Resend (Sent Emails) are now hidden from the UI when Filament Shield is installed and the authenticated user lacks the corresponding permission. Falls back to the previous always-visible behavior when Shield is absent, so existing installs are unaffected (#12, thanks @agencetwogether)FinMailPlugin::isShieldAvailable() helper for checking Shield presencepreview_heading translation key for the preview modal header, populated across all 58 supported localesInstallCommand now seeds preview, sendTest, compose, and resend into the Filament Shield config so shield:generate produces the matching policy methods and permissionsauthorizeIndividualRecords('delete') when Shield is activephp artisan shield:generate --panel=admin --option=policies_and_permissions to register the new permissionsFull Changelog: https://github.com/finity-labs/fin-mail/compare/v1.6.0...v1.7.0
extraData() method (and native with() support) on TemplateMail for passing variables directly to the Blade view, separate from the token replacement system. Useful for view-only data that doesn't need to flow through the token engine (#10, thanks @agencetwogether)null if not set, so existing templates are unaffected. The TemplateMail mailable also gains an overrideReplyTo() setter for runtime overrides (#9, thanks @agencetwogether)A new migration is included (add_reply_to_on_email_templates_table). Run php artisan migrate after upgrading.
fin-mail.php config instead of hardcoded defaults, fixing issues with foreign key references when table names are customized (#7, thanks @agencetwogether)FinMailPlugin::make()->customBlocks([...]). Custom blocks now render correctly in the editor, preview mode, and sent emails. ButtonBlock is always included by default. Closes #6EmailTemplate, TipTapConverter, and DefaultEditor now reads from a dynamic plugin-level registry instead of a hardcoded listdate_format and datetime_format config options with per-locale array supportSee CHANGELOG.md for full details.
php artisan fin-mail:upgrade command to migrate existing data after package updates (supports --dry-run)Str::limit(), causing a TypeError<a> tags in seeded templates were stripped by TipTap; buttons now use the native customBlock formatblocks and versioning translation keys for all 59 supported languagescomposer update finity-labs/fin-mail
php artisan fin-mail:upgrade
Full changelog: https://github.com/finity-labs/fin-mail/blob/main/CHANGELOG.md
Merge Tags — Tokens are now available directly in the editor toolbar. No more switching to the Tokens tab to remember what's available.
CTA Button Block — Insert styled call-to-action buttons from the custom blocks panel. Set the text, URL, and alignment — theme colors are applied automatically.
Inline Link Styling — Links in email body now render with the correct theme color in all email clients, including those that strip <style> blocks.
Live Theme Preview — Change a color in the theme editor and see it update instantly.
Custom Theme Auto-Setup — The install command now detects your custom Filament theme CSS and offers to register FinMail styles automatically.
Full Changelog: https://github.com/finity-labs/fin-mail/compare/v1.0.1...v1.1.0
spatie/laravel-settings migration automatically if the settings table doesn't exist yet — no more crashes on fresh installspolicyNamespace() option on the plugin, so Shield-generated policies can live anywhere (defaults to App\Policies)phpdocumentor/reflection-docblock 6.xGate::policy() instead of relying on bundled policy files. This means Shield generates the policies (as it should), and FinMail just wires them up to the right modelsHow can I help you explore Laravel packages today?