smart | Webentwicklung
Alles rund um HTML5, PHP, WordPress & Co.

Ruby on Rails: E-Mail mit ActionMailer versenden

14. August 2012
Stephan
Ruby on Rails: E-Mails versenden

Bei vielen Web-Applikationen benötigt man des Öfteren eine E-Mail-Funktionalität zum Versenden bzw. Empfangen von E-Mails.

Falls ihr also innerhalb eurer Ruby on Rails Applikation E-Mails versenden möchtet, habt ihr Glück, denn mit der ActionMailer-Klasse ist das Versenden von E-Mails in Ruby on Rails sehr leicht umzusetzen.

In diesem Artikel zeige ich euch anhand eines einfachen Beispiel, wie ihr in Ruby on Rails E-Mails versenden könnt.

Erstellung unseres eigenen Mailers

Als erstes erstellen wir uns unsere eigene ActionMailer-Klasse. Dazu erstellen wir im Verzeichnis app/mailers die Datei info_mailer.rb mit folgendem Inhalt:

class InfoMailer < ActionMailer::Base
    default from: 'from@example.com'

    def info_message(user)
        @user = user

        mail to: @user.email, 
             subject: 'Info-Mail'
    end
end

Wir haben nun die InfoMailer-Klasse erstellt. Als unsere Standard-Absender-Adresse haben wir „from@example.com“ definiert (siehe Zeile 2).

Weiterhin haben wir eine Methode namens info_message, welche als Parameter ein User-Objekt erwartet. Über die Methode mail versenden wir letztendlich die E-Mail an unseren Benutzer.

Inhalt bzw. Text der E-Mail angeben

Eine E-Mail nur mit Betreff und ohne Inhalt macht nicht so viel Sinn, weshalb wir uns nun um den Inhalt der E-Mail kümmern. Zum einen könnten wir der mail-Methode den Parameter body mitgeben:

mail to: @user.email, 
     subject: 'Info-Mail'
     body: 'Text'

Eine bessere Möglichkeit ist es aber eine extra View anzulegen. Erwähnt sei, dass wir sowohl eine View für eine HTML-E-Mail als auch eine für eine reine Text-E-Mail anlegen können. Letztere Variante möchte ich euch hier zeigen.

Dazu erstellt ihr nun im Verzeichnis app/views/info_mailer die Datei info_message.text.erb mit folgendem Inhalt:

Hallo <%= @user.full_name %>,

über den folgenden Link können Sie sich die Top-Produkte unseres Sortiments ansehen:

<a href="<%= @top_products_url %>">Top-Produkte</a>

Wir ersichtlich ist, haben wir in der View Zugriff auf unser User-Objekt. Um nun die URL für unsere Produkte-Seite zu erhalten, nehmen wir folgende Anpassung in unserer info_message-Methode vor:

class InfoMailer < ActionMailer::Base
    default from: 'from@example.com'

    def info_message(user)
        @user = user
        @top_products_url = url_for :host => 'example.com',
                                    :controller => 'products',
                                    :action => 'top',
                                    ::only_path => false

        mail to: @user.email, 
             subject: 'Info-Mail'
    end
end

Natürlich könnten wir in unserer View auch den link_to-Helper verwenden. Wichtig ist bei beiden nur, dass der host-Parameter mit angegeben wird, weil die InfoMailer-Klasse keinerlei Bezug zum aktuellen Kontext bzw. Request hat und somit die Host-Adresse nicht kennt.

Aufruf unserers Mailers und Versenden unserer E-Mail

Nun können wir unsere erstellte InfoMailer-Klasse zum Versenden von E-Mail nutzen. Dazu müssen wir nur Folgendes tun:

# auf die User-Klasse möchte ich hier nicht weiter eingehen, bei Fragen schreibt einfach ein Kommentar
@user = User.find(1)

InfoMailer.info_message(@user).deliver

Das war es auch schon – unsere E-Mail wurde nun versandt!

Fazit

Wie ihr (hoffentlich) durch diesen Artikel gesehen habt, ist das Versenden von E-Mails in Ruby on Rails relativ einfach zu implementieren.

Weiterführende Informationen zum Thema Ruby on Rails & E-Mails findet ihr im Rails-Guide: Action Mailer Basics

Habt ihr selbst auch schon E-Mails in euren Ruby on Rails Applikationen versenden müssen? Wie findet ihr die ActionMailer-Klasse?

Kommentare  
0 Kommentare vorhanden
0 Trackbacks/Pingbacks vorhanden
Du bist herzlich eingeladen auch ein Kommentar zu hinterlassen!
Kommentar schreiben

Vielen Dank für dein Kommentar!