Note: MailStyle was originally called Shemail but was changed due to a general negative response to the name from the public.
Background
Writing inline styles for HTML emails is dull and boring but unfortunately a necessary evil. Rather than do it by hand we thought it would be nicer to let our app do it for us. So we wrote MailStyle.
Enter MailStyle
MailStyle allows you to write the css for your html emails as you normally would, then writes the styles inline when you send your emails. It also makes sure that your image paths are absolute rather than relative.
Installation
First install the dependencies:
sudo gem install nokogiri css_parser
Then install MailStyle to your rails app:
script/plugin install http://github.com/purify/mail_style
Usage
Rendering CSS Inline
Simply add the css method to your deliver actions:
class Notifier < ActionMailer::Base
def welcome_email
css :email
subject 'Welcome Aboard'
recipients 'someone@example.com'
from 'jimneath@googlemail.com'
sent_on Time.now
end
end
This will look for a css file called email.css in your public/stylesheets folder. The css method can take either a string or a symbol. You can also pass the css file name with or without the .css extension.
MailStyle will now write the styles from email.css into html part of the welcome email (eg. welcome_email.text.html.erb). It won’t touch the plain text part, neither will it do anything if you’re only sending a single part email (eg. welcome_email.html.erb). You shouldn’t be sending html emails without a plain text version anyway.
Say that our email.css file looks like the following:
body { background: #000 }
p { color: #f00; line-height: 1.5 }
.text { font-size: 14px }
And our welcome_email.text.html.erb looks like this:
<p class="text">Hello World</p>
Then the resulting html that will be sent out will resemble the following:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body style="background: #000">
<p style="color: #f00;line-height:1.5;font-size: 14px">Hello World</p>
</body>
</html>
Fixing Image URLs
If you have default_url_options:host set in your mailer, then MailStyle will do it’s best to make the urls of images absolute.
In your mailer
ActionMailer::Base.default_url_options[:host] = "example.com"
Example CSS
p { background-image: url(../images/chunky-bacon.png) }
Example HTML View
<img src="/images/header.jpg">
<p>Hello World</p>
Example Output
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<img src="http://example.com/images/header.jpg">
<p style="background-image: url(http://example.com/images/chunky-bacon.png)">Hello World</p>
</body>
</html>
How You Can Help
The main issue at the moment is speed, so any help speeding things up would be awesome. As always, you can fork the repo at Github.
Further Reading
Below are a couple of links you may find useful regarding HTML emails:
- Email Design Guidelines>
- Guide to CSS support in email clients>
- Free Email Marketing Guide>
- HTML email design and coding tips part II>
Tagged with