A recipe for a better user experience in emails sent between users via my Rails app.
Why
When I receive an email from an automated system like a Rails app, it can be disorienting if the sender shows up in the email program as “admin” or “donotreply”.
What I want is something like this:
Ingredients
- ActionMailer
- The
email_spec
Ruby gem
Install email-spec
I’m a fan of Ben Mabey’s email-spec gem, so I’ll install that:
group :test do
gem 'email_spec'
end
I create a features/support/email.rb
file:
require 'email_spec' # add this line if you use spork
require 'email_spec/cucumber'
Then generate some step definitions into
features/step_definitions/email_steps.rb
:
rails generate email_spec:steps
Feature
Now I’ll write my user story:
Scenario: Guitarist shares song with guitarist
Given the following user exists:
| name | email |
| Eric Clapton | eric@example.com |
And I sign in as "eric@example.com/password"
And I am on the share page for "Layla"
When I fill in "Share with" with "jimi@example.com"
And I press "Share Song"
And "jimi@example.com" opens the email
Then he should see "Eric Clapton" in the email "From" header
And he should see "eric@example.com" in the email "Reply-To" header
The “From” and “Reply-To” headers
I think the “From” and “Reply-To” headers can provide a better user experience.
I don’t set the author’s email as the “From” header because I hear it’s bad spam practice to send email on behalf of users in that way. ISPs use the From header (among other things) to determine if the originator is sending spam.
Making the feature pass
Ease my worried mind:
class Mailer < ActionMailer::Base
def share_song(song, friend)
mail(
to: friend.email,
from: "#{song.artist.name} #{hello@mystartup.com}",
reply_to: song.artist.email,
subject: 'Good song'
)
end
end
I’ve used this format so the sender’s name shows up in the receiver’s email program:
"Eric"
In this case, I want Jimi to be able to reply directly to Eric, so I’ve set the “Reply-To” header to be the sender’s address. I’ve explicitly not put the sender’s name in the “Reply-To” header because that doesn’t work.
In other cases, I want the receiver to reply to the email and have that sent through the Rails app, but that’s a story for another day.