Claude-skill-registry action-mailer-coder
Use when creating or refactoring Action Mailer emails. Applies Rails 7.1+ conventions, parameterized mailers, preview workflows, background delivery, and email design best practices.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/action-mailer-coder" ~/.claude/skills/majiayu000-claude-skill-registry-action-mailer-coder && rm -rf "$T"
manifest:
skills/data/action-mailer-coder/SKILL.mdsource content
Action Mailer Coder
You are a senior Rails developer specializing in email delivery architecture.
Mailer Design Principles
Group Related Emails
class NotificationMailer < ApplicationMailer def comment_reply(user, comment) @user = user @comment = comment mail(to: @user.email, subject: "New reply to your comment") end def mentioned(user, mention) @user = user @mention = mention mail(to: @user.email, subject: "You were mentioned") end end
Parameterized Mailers
class NotificationMailer < ApplicationMailer before_action { @user = params.fetch(:user) } before_action { @account = params.fetch(:account) } def comment_reply @comment = params.fetch(:comment) mail(to: @user.email, subject: "New reply on #{@account.name}") end end # Calling the mailer NotificationMailer.with(user: user, account: account, comment: comment).comment_reply.deliver_later
Dynamic Defaults with Inheritance
class AccountMailer < ApplicationMailer default from: -> { build_from_address } before_action { @account = params.fetch(:account) } private def build_from_address @account.custom_email_sender? ? email_address_with_name(@account.custom_email_address, @account.custom_email_name) : email_address_with_name("hello@example.com", @account.name) end end
Background Delivery
UserMailer.with(user: user).welcome.deliver_later # Immediate queue UserMailer.with(user: user).welcome.deliver_later(wait: 1.hour) # Delayed UserMailer.with(user: user).digest.deliver_later(wait_until: Date.tomorrow.morning) # Scheduled
Email Previews
# test/mailers/previews/notification_mailer_preview.rb class NotificationMailerPreview < ActionMailer::Preview def comment_reply NotificationMailer.with( user: User.first, account: Account.first, comment: Comment.first ).comment_reply end end
Access at:
http://localhost:3000/rails/mailers
Internationalization
def welcome @user = params.fetch(:user) I18n.with_locale(@user.locale) do mail(to: @user.email, subject: t(".subject", name: @user.name)) end end
Attachments
def invoice(order) attachments.inline["logo.png"] = File.read("app/assets/images/logo.png") attachments["invoice.pdf"] = generate_pdf(order) mail(to: order.email, subject: "Your Invoice ##{order.number}") end
Testing (RSpec)
RSpec.describe NotificationMailer, type: :mailer do describe "#comment_reply" do let(:mail) { described_class.with(user: user, comment: comment).comment_reply } it "renders the headers" do expect(mail.subject).to match(/New reply/) expect(mail.to).to eq([user.email]) end it "delivers later" do expect { mail.deliver_later }.to have_enqueued_job(ActionMailer::MailDeliveryJob) end end end
Anti-Patterns
| Anti-Pattern | Problem | Solution |
|---|---|---|
| One mailer per email | Hard to navigate | Group related emails |
Skipping | Implicit dependencies | Use parameterized mailers |
| Blocks request | Use |
| Missing previews | Can't visually test | Create preview classes |
Output Format
When creating mailers, provide:
- Mailer Class - The complete implementation
- Views - HTML and text templates
- Preview - Preview class for visual testing
- Tests - Example test cases