Hanami::Mailer
Mail for Ruby applications.
Status
Contact
- Home page: http://hanamirb.org
- Mailing List: http://hanamirb.org/mailing-list
- API Doc: http://rdoc.info/gems/hanami-mailer
- Bugs/Issues: https://github.com/hanami/mailer/issues
- Support: http://stackoverflow.com/questions/tagged/hanami
- Chat: http://chat.hanamirb.org
Rubies
Hanami::Mailer supports Ruby (MRI) 2.3+ and JRuby 9.1.5.0+.
Installation
Add this line to your application's Gemfile:
gem 'hanami-mailer'
And then execute:
$ bundle
Or install it yourself as:
$ gem install hanami-mailer
Usage
Conventions
- Templates are searched under
Hanami::Mailer.configuration.root, set this value according to your app structure (eg."app/templates"). - A mailer will look for a template with a file name that is composed by its full class name (eg.
"articles/index"). - A template must have two concatenated extensions: one for the format and one for the engine (eg.
".html.erb"). - The framework must be loaded before rendering the first time:
Hanami::Mailer.load!.
Mailers
A simple mailer looks like this:
require 'hanami/mailer'
class InvoiceMailer
include Hanami::Mailer
end
A mailer with .to and .from addresses and mailer delivery:
require 'hanami/mailer'
Hanami::Mailer.configure do
delivery_method :smtp,
address: "smtp.gmail.com",
port: 587,
domain: "example.com",
user_name: ENV['SMTP_USERNAME'],
password: ENV['SMTP_PASSWORD'],
authentication: "plain",
enable_starttls_auto: true
end.load!
class WelcomeMailer
include Hanami::Mailer
from '[email protected]'
to '[email protected]'
cc '[email protected]'
bcc '[email protected]'
subject 'Welcome'
end
WelcomeMailer.deliver
Locals
The set of objects passed in the deliver call are called locals and are available inside the mailer and the template.
require 'hanami/mailer'
User = Struct.new(:name, :username, :email)
luca = User.new('Luca', 'jodosha', '[email protected]')
class WelcomeMailer
include Hanami::Mailer
from '[email protected]'
subject 'Welcome'
to :recipient
private
def recipient
user.email
end
end
WelcomeMailer.deliver(user: luca)
The corresponding erb file:
Hello <%= user.name %>!
Scope
All public methods defined in the mailer are accessible from the template:
require 'hanami/mailer'
class WelcomeMailer
include Hanami::Mailer
from '[email protected]'
to '[email protected]'
subject 'Welcome'
def greeting
'Ahoy'
end
end
<h2><%= greeting %></h2>
Template
The template file must be located under the relevant root and must match the inflected snake case of the mailer class name.
# Given this root
Hanami::Mailer.configuration.root # => #<Pathname:app/templates>
# For InvoiceMailer, it looks for:
# * app/templates/invoice_mailer.html.erb
# * app/templates/invoice_mailer.txt.erb
If we want to specify a different template, we can do:
class InvoiceMailer
include Hanami::Mailer
template 'invoice'
end
# It will look for:
# * app/templates/invoice.html.erb
# * app/templates/invoice.txt.erb
Engines
The builtin rendering engine is ERb.
This is the list of the supported engines.
They are listed in order of higher precedence, for a given extension.
For instance, if ERubis is loaded, it will be preferred over ERb to render .erb templates.
| Engine | Extensions |
|---|---|
| Erubis | erb, rhtml, erubis |
| ERb | erb, rhtml |
| Redcarpet | markdown, mkd, md |
| RDiscount | markdown, mkd, md |
| Kramdown | markdown, mkd, md |
| Maruku | markdown, mkd, md |
| BlueCloth | markdown, mkd, md |
| Asciidoctor | ad, adoc, asciidoc |
| Builder | builder |
| CSV | rcsv |
| CoffeeScript | coffee |
| WikiCloth | wiki, mediawiki, mw |
| Creole | wiki, creole |
| Etanni | etn, etanni |
| Haml | haml |
| Less | less |
| Liquid | liquid |
| Markaby | mab |
| Nokogiri | nokogiri |
| Plain | html |
| RDoc | rdoc |
| Radius | radius |
| RedCloth | textile |
| Sass | sass |
| Scss | scss |
| Slim | slim |
| String | str |
| Yajl | yajl |
Configuration
Hanami::Mailer can be configured with a DSL that determines its behavior. It supports a few options:
require 'hanami/mailer'
Hanami::Mailer.configure do
# Set the root path where to search for templates
# Argument: String, Pathname, #to_pathname, defaults to the current directory
#
root '/path/to/root'
# Set the default charset for emails
# Argument: String, defaults to "UTF-8"
#
default_charset 'iso-8859'
# Set the delivery method
# Argument: Symbol
# Argument: Hash, optional configurations
delivery_method :stmp
end
Attachments
Attachments can be added with the following API:
class InvoiceMailer
include Hanami::Mailer
# ...
def prepare
mail.['invoice.pdf'] = '/path/to/invoice.pdf'
# or
mail.['invoice.pdf'] = File.read('/path/to/invoice.pdf')
end
end
Delivery Method
The global delivery method is defined through the Hanami::Mailer configuration, as:
Hanami::Mailer.configuration do
delivery_method :smtp
end
Hanami::Mailer.configuration do
delivery_method :smtp, address: "localhost", port: 1025
end
Builtin options are:
- Exim (
:exim) - Sendmail (
:sendmail) - SMTP (
:smtp, for local installations) - SMTP Connection (
:smtp_connection, viaNet::SMTP- for remote installations) - Test (
:test, for testing purposes)
Custom Delivery Method
Developers can specify their own custom delivery policy:
require 'hanami/mailer'
class MandrillDeliveryMethod
def initialize()
@options =
end
def deliver!(mail)
# ...
end
end
Hanami::Mailer.configure do
delivery_method MandrillDeliveryMethod,
username: ENV['MANDRILL_USERNAME'],
password: ENV['MANDRILL_API_KEY']
end.load!
The class passed to .delivery_method must accept an optional set of options
with the constructor (#initialize) and respond to #deliver!.
Multipart Delivery
All the email are sent as multipart messages by default.
For a given mailer, the framework looks up for associated text (.txt) and HTML (.html) templates and render them.
InvoiceMailer.deliver # delivers both text and html templates
InvoiceMailer.deliver(format: :txt) # delivers only text template
Please note that they aren't both mandatory, but at least one of them MUST be present.
Versioning
Hanami::Mailer uses Semantic Versioning 2.0.0
Copyright
Copyright © 2015-2017 Luca Guidi – Released under MIT License
This project was formerly known as Lotus (lotus-mailer).