Spree Emails
Spree Emails provides transactional email templates and mailers for Spree Commerce, handling order confirmations, shipment notifications, and other customer communications.
Overview
This gem includes:
- Order Mailer - Order confirmation and cancellation emails
- Shipment Mailer - Shipping and delivery notifications
- Reimbursement Mailer - Refund notifications
- Event Subscribers - Automatic email triggers on store events
- Email Templates - Customizable HTML and text templates
Installation
bundle add spree_emails
Email Types
Order Emails
- Order Confirmation - Sent when an order is completed
- Order Cancellation - Sent when an order is cancelled
Shipment Emails
- Shipment Notification - Sent when a shipment is shipped
- Delivery Confirmation - Sent when tracking shows delivered
Reimbursement Emails
- Refund Notification - Sent when a reimbursement is processed
Configuration
Transactional emails are controlled per-store via the send_consumer_transactional_emails preference. This can be configured in the admin dashboard under Store Settings, or programmatically:
# Enable/disable transactional emails for a store
store = Spree::Store.current
store.update(send_consumer_transactional_emails: true)
The sender address is configured via the mail_from_address attribute on each store:
store.update(mail_from_address: 'orders@example.com')
Action Mailer Configuration
# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.example.com',
port: 587,
user_name: ENV['SMTP_USERNAME'],
password: ENV['SMTP_PASSWORD'],
authentication: 'plain',
enable_starttls_auto: true
}
Customization
Overriding Templates
Copy email templates to your application:
# Copy all email templates
cp -r $(bundle show spree_emails)/app/views/spree/mailer app/views/spree/
# Or copy specific templates
cp $(bundle show spree_emails)/app/views/spree/mailer/order_mailer/confirm_email.html.erb \
app/views/spree/mailer/order_mailer/
Template Structure
app/views/spree/mailer/
├── order_mailer/
│ ├── confirm_email.html.erb
│ ├── confirm_email.text.erb
│ ├── cancel_email.html.erb
│ └── cancel_email.text.erb
├── shipment_mailer/
│ ├── shipped_email.html.erb
│ └── shipped_email.text.erb
└── reimbursement_mailer/
├── reimbursement_email.html.erb
└── reimbursement_email.text.erb
Custom Mailer
Create custom mailers by extending Spree's base mailer:
# app/mailers/spree/order_mailer_decorator.rb
module Spree
module OrderMailerDecorator
def confirm_email(order, resend = false)
@custom_data = fetch_custom_data(order)
super
end
private
def fetch_custom_data(order)
# Custom logic
end
end
end
Spree::OrderMailer.prepend(Spree::OrderMailerDecorator)
Adding New Email Types
# app/mailers/spree/custom_mailer.rb
module Spree
class CustomMailer < BaseMailer
def welcome_email(user)
@user = user
mail(to: @user.email, subject: 'Welcome to our store!')
end
end
end
Event Integration
Emails are triggered via Spree's event system. Create custom subscribers:
# app/subscribers/my_app/custom_email_subscriber.rb
module MyApp
class CustomEmailSubscriber < Spree::Subscriber
subscribes_to 'customer.created'
def handle(event)
user_id = event.payload['id']
user = Spree.user_class.find_by(id: user_id)
return unless user
Spree::CustomMailer.welcome_email(user).deliver_later
end
end
end
Then register the subscriber in an initializer:
# config/initializers/spree.rb
Rails.application.config.after_initialize do
Spree.subscribers << MyApp::CustomEmailSubscriber
end
Disabling Emails
Disable transactional emails for a specific store:
store = Spree::Store.current
store.update(send_consumer_transactional_emails: false)
This setting can also be managed in the admin dashboard under Store Settings.
To disable all Spree transactional emails globally, remove this gem from your application:
bundle remove spree_emails
Using Third-Party Email Services
If you prefer to use a third-party email service like Klaviyo for transactional emails, you can use the spree_klaviyo extension. This allows you to leverage Klaviyo's email marketing platform for order confirmations, shipment notifications, and other transactional emails.
Previewing emails
ActionMailer previews for every transactional email ship with this gem and are served automatically in development — no setup required. With a seeded development database, start the server and visit:
http://localhost:3000/rails/mailers
for example http://localhost:3000/rails/mailers/spree/order/confirm_email.
Testing
Run the test suite:
cd emails
bundle exec rake test_app # First time only
bundle exec rspec