All Projects → fphilipe → Premailer Rails

fphilipe / Premailer Rails

Licence: mit
CSS styled emails without the hassle.

Programming Languages

ruby
36898 projects - #4 most used programming language

Projects that are alternatives of or similar to Premailer Rails

Octicons
A scalable set of icons handcrafted with <3 by GitHub
Stars: ✭ 7,039 (+409.33%)
Mutual labels:  rails, gem
Instagram api gem
A Ruby wrapper for the Instagram API
Stars: ✭ 100 (-92.76%)
Mutual labels:  rails, gem
Bh
Bootstrap Helpers for Ruby
Stars: ✭ 834 (-39.65%)
Mutual labels:  rails, gem
Letter opener web
A web interface for browsing Ruby on Rails sent emails
Stars: ✭ 513 (-62.88%)
Mutual labels:  rails, email
Bhf
Rails-Engine-Gem that offers an admin interface for trusted user
Stars: ✭ 81 (-94.14%)
Mutual labels:  rails, gem
Yt
The reliable YouTube API Ruby client
Stars: ✭ 674 (-51.23%)
Mutual labels:  rails, gem
Adminpanel
This gem has the goal to act as the administration panel for your resources, so you can focus only on the public part of your app
Stars: ✭ 7 (-99.49%)
Mutual labels:  rails, gem
Algoliasearch Rails
AlgoliaSearch integration to your favorite ORM
Stars: ✭ 352 (-74.53%)
Mutual labels:  rails, gem
Tabler Rubygem
Rubygem for https://tabler.github.io
Stars: ✭ 77 (-94.43%)
Mutual labels:  rails, gem
Render async
render_async lets you include pages asynchronously with AJAX
Stars: ✭ 974 (-29.52%)
Mutual labels:  rails, gem
Lol dba
lol_dba is a small package of rake tasks that scan your application models and displays a list of columns that probably should be indexed. Also, it can generate .sql migration scripts.
Stars: ✭ 1,363 (-1.37%)
Mutual labels:  rails, gem
Validates formatting of
Common Rails validations wrapped in a gem.
Stars: ✭ 91 (-93.42%)
Mutual labels:  rails, gem
Motion
Reactive frontend UI components for Rails in pure Ruby
Stars: ✭ 498 (-63.97%)
Mutual labels:  rails, gem
Materialize Sass
Materializecss rubygem for Rails Asset Pipeline / Sprockets
Stars: ✭ 785 (-43.2%)
Mutual labels:  rails, gem
Devise masquerade
Extension for devise, enable login as functionality. Add link to the masquerade_path(resource) and use it.
Stars: ✭ 380 (-72.5%)
Mutual labels:  rails, gem
Datagrid
Gem to create tables grids with sortable columns and filters
Stars: ✭ 921 (-33.36%)
Mutual labels:  rails, gem
Material icons
A simple Rails wrapper for Google Material Icons
Stars: ✭ 266 (-80.75%)
Mutual labels:  rails, gem
Milia
Easy multi-tenanting for Rails5 (or Rails4) + Devise
Stars: ✭ 326 (-76.41%)
Mutual labels:  rails, gem
Administrate Field Belongs to search
Plugin that adds search capabilities to belongs_to associations for Administrate
Stars: ✭ 29 (-97.9%)
Mutual labels:  rails, gem
Pager Api
Easy API pagination for Rails
Stars: ✭ 86 (-93.78%)
Mutual labels:  rails, gem

premailer-rails

CSS styled emails without the hassle.

Build Status Gem Version Code Climate Coverage Status

Introduction

This gem is a drop in solution for styling HTML emails with CSS without having to do the hard work yourself.

Styling emails is not just a matter of linking to a stylesheet. Most clients, especially web clients, ignore linked stylesheets or <style> tags in the HTML. The workaround is to write all the CSS rules in the style attribute of each tag inside your email. This is a rather tedious and hard to maintain approach.

Premailer to the rescue! The great premailer gem applies all CSS rules to each matching HTML element by adding them to the style attribute. This allows you to keep HTML and CSS in separate files, just as you're used to from web development, thus keeping your sanity.

This gem is an adapter for premailer to work with actionmailer out of the box. Actionmailer is the email framework used in Rails, which also works outside of Rails. Although premailer-rails has certain Rails specific features, it also works in the absence of Rails making it compatible with other frameworks such as sinatra.

How It Works

premailer-rails works with actionmailer by registering a delivery hook. This causes all emails that are delivered to be processed by premailer-rails. This means that by simply including premailer-rails in your Gemfile you'll get styled emails without having to set anything up.

Whenever premailer-rails processes an email, it collects the URLs of all linked stylesheets (<link rel="stylesheet" href="css_url">). Then, for each of these URLs, it tries to get the content through a couple of strategies. As long as a strategy does not return anything, the next one is used. The strategies available are:

  • :filesystem: If there's a file inside public/ with the same path as in the URL, it is read from disk. E.g. if the URL is http://cdn.example.com/assets/email.css the contents of the file located at public/assets/email.css gets returned if it exists.

  • :asset_pipeline: If Rails is available and the asset pipeline is enabled, the file is retrieved through the asset pipeline. E.g. if the URL is http://cdn.example.com/assets/email-fingerprint123.css, the file email.css is requested from the asset pipeline. That is, the fingerprint and the prefix (in this case assets is the prefix) are stripped before requesting it from the asset pipeline.

  • :network: As a last resort, the URL is simply requested and the response body is used. This is useful when the assets are not bundled in the application and only available on a CDN. On Heroku e.g. you can add assets to your .slugignore causing your assets to not be available to the app (and thus resulting in a smaller app) and deploy the assets to a CDN such as S3/CloudFront.

You can configure which strategies you want to use as well as specify their order. Refer to the Configuration section for more on this.

Note that the retrieved CSS is cached when the gem is running with Rails in production.

Installation

Simply add the gem to your Gemfile:

gem 'premailer-rails'

premailer-rails and premailer require a gem that is used to parse the email's HTML. For a list of supported gems and how to select which one to use, please refer to the Adapter section of premailer. Note that there is no hard dependency from either gem so you should add one yourself. Also note that this gem is only tested with nokogiri.

Configuration

Premailer itself accepts a number of options. In order for premailer-rails to pass these options on to the underlying premailer instance, specify them as follows (in Rails you could do that in an initializer such as config/initializers/premailer_rails.rb):

Premailer::Rails.config.merge!(preserve_styles: true, remove_ids: true)

For a list of options, refer to the premailer documentation. The default configs are:

{
  input_encoding: 'UTF-8',
  generate_text_part: true,
  strategies: [:filesystem, :asset_pipeline, :network]
}

If you don't want to automatically generate a text part from the html part, set the config :generate_text_part to false.

Note that the options :with_html_string and :css_string are used internally by premailer-rails and thus will be overridden.

If you're using this gem outside of Rails, you'll need to call Premailer::Rails.register_interceptors manually in order for it to work. This is done ideally in some kind of initializer, depending on the framework you're using.

premailer-rails reads all stylesheet <link> tags, inlines the linked CSS and removes the tags. If you wish to ignore a certain tag, e.g. one that links to external fonts such as Google Fonts, you can add a data-premailer="ignore" attribute.

Usage

premailer-rails processes all outgoing emails by default. If you wish to skip premailer for a certain email, simply set the :skip_premailer header:

class UserMailer < ActionMailer::Base
  def welcome_email(user)
    mail to: user.email,
         subject: 'Welcome to My Awesome Site',
         skip_premailer: true
  end
end

Note that the mere presence of this header causes premailer to be skipped, i.e., even setting skip_premailer: false will cause premailer to be skipped. The reason for that is that the skip_premailer is a simple header and the value is transformed into a string, causing 'false' to become truthy.

Emails are only processed upon delivery, i.e. when calling #deliver on the email, or when previewing them in rails. If you wish to manually trigger the inlining, you can do so by calling the hook:

mail = SomeMailer.some_message(args)
Premailer::Rails::Hook.perform(mail)

This will modify the email in place, useful e.g. in tests.

Small Print

Author

Philipe Fatio (@fphilipe)

License

premailer-rails is released under the MIT license. See the license file.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].