Screencast: HTML Emails mit Rails verschicken

Um Mails in HTML zu verschicken, bedarf es einiger Vorbereitung, da diese nicht wie Standard-Webseiten erstellt werden können. Die Unterschiede sind mannigfaltig, aber es gibt ein paar Helfer in Form von Gems, die diese Arbeit erleichtern. Ryan zeigt in diesem Screencast wie premailer-rails3 und roadie eingesetzt werden können.

 

Downloads in verschiedenen Formaten:

mp4
m4v
webm
ogg

 

Resourcen:

terminal

[bash]
rails new mailit
cd mailit
rails g mailer newsletter_mailer weekly
bundle
rails c
[/bash]

Gemfile

[ruby]
gem ‚roadie‘

# or

gem ‚hpricot‘
gem ‚premailer-rails3‘
[/ruby]

app/mailers/newsletter_mailer.rb

[ruby]
def weekly(email)
mail to: email, subject: "RailsCasts Weekly"
end
[/ruby]

config/environments/development.rb

[ruby]
config.action_mailer.default_url_options = { host: "railscasts.com" }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "railscasts.com",
authentication: "plain",
enable_starttls_auto: true,
user_name: ENV["GMAIL_USERNAME"],
password: ENV["GMAIL_PASSWORD"]
}
[/ruby]

rails console

[ruby]
NewsletterMailer.weekly("foo@example.com").deliver
[/ruby]

Security: Sicherheitsupdate für Mail (betrifft Rails)

Mikel Lindsaar hat eine neue Vesion des mail gems veröffentlicht, dass eine mögliche Sicherheitslücke mit der „sendmail delivery“ Methode schließt. Die Lücke ermöglicht unter bestimmten Umständen das Ausführen von Kommandos auf dem betroffenen System. Rails Applikationen welche die „sendmail delivery“ Methode nicht verwenden, sind nicht davon betroffen.

Betroffene Version:      2.2.14 und früher
Korrigierte Version:         2.2.15 und danach

 

Auswirkung
——————————————————————

Angreifer können unter bestimmten Bedingungen eine modifizierte Email verfassen, um Shell-Kommandos auf dem betroffenen System auszuführen. Benutzer früherer Version des gems (kleiner 2.2.14) wird empfohlen Ihr System baldsmöglich zu aktualisieren bzw. anzupassen.
Ab Mail-Version 2.2.15 ist der Fehler korrigiert und das Gem steht auf RubyGems.org zum Download bereit.

Bei der Verwendung von Bundler, sollte das Gemfile entsprechend angepasst…

[ruby]
gem "mail", "~> 2.2.15"
[/ruby]

…und danach die Aktualisierung über folgenden Befehl angestossen swerden

[bash]
$ bundle install
[/bash]

 

Workarounds
——————————————————————
Das Anpassen der Versand-Methode nach SMTP oder File behebt die Lücke in der Applikation ebenfalls.
Details wie SMTP oder File verwendet werden kann gibt es unter folgenden Links:
http://rdoc.info/github/mikel/mail/master/Mail/SMTP
http://rdoc.info/github/mikel/mail/master/Mail/FileDelivery

 

Patch
——————————————————————
Wenn ein komplettes Update nicht möglich oder nicht gewünscht ist, kann auch den entsprechenden Patch benutzen.
Der Patch steht hier zum Download bereit:
https://github.com/mikel/mail/raw/master/patches/20110126_sendmail.patch

Emails mit Ruby verschicken

Um mit Ruby Emails zu verschicken gibt momentan einige Möglichkeiten die Quasi-Standard geworden sind. Zum einen Net::SMTP oder TMail und natürlich als Teil von Ruby on Rails den ActionMailer. Zu diesen drei Lösungen gibt es seit kurzem auch noch mail von Mikel Lindsaar.

Die Bibliothek Mail ist Ruby geschrieben und bringt alles mit um Email zu verschicken. Mit Mail können Email generiert, geparst und verschickt werden.

Um nicht innerhalb kürzester Zeit veraltet zu sein, wurde die Unterstützung für Ruby 1.9 von Anfang berücksichtigt.

Laut Mikel soll Mail 100% Spezifikations-Abdeckung bieten.

Die Projektseiten bieten viele Beispiele und die Bibliothek ist sicherlich einen Blick wert, wenn die eigene Applikation auch Emails unterstützen soll.

Ein kurzes Beispiel (Mail incl. Attachement) wie Mail benutzt werden kann:

[ruby]
Mail.defaults do
smtp ‚ip.oder.host.com‘ # Port 25 defult
end

mail = Mail.new do
from ’sender@example.com‘
to ‚empfaenger@example.com‘
subject ‚Ein sinnvoller Betreff‘
body File.read(‚mail-text.txt‘)
add_file {:filename => ‚einegrafik.png‘, :data => File.read(‚/pfad/zu/einer/grafik.png‘)}
end

mail.deliver!
[/ruby]

Mail ist auf Github zuhause: http://github.com/mikel/mail