action-mailer-coder

Mailer Design Principles

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "action-mailer-coder" with this command: npx skills add majesticlabs-dev/majestic-marketplace/majesticlabs-dev-majestic-marketplace-action-mailer-coder

Action Mailer Coder

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 .with()

Implicit dependencies Use parameterized mailers

deliver_now

Blocks request Use deliver_later

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

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

google-ads-strategy

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

viral-content

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

market-research

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

free-tool-arsenal

No summary provided by upstream source.

Repository SourceNeeds Review