Als E-Mail Service Provider und Entwickler ist es unser Ziel, Prozesse zu verbessern. Wir möchten E-Mail Versender Werkzeuge an die Hand geben, mit denen sie E-Mails mit dem größtmöglichen Mehrwert erstellen. Mit MJML haben wir ein Open-Source Framework entwickelt, um die Erstellung von responsiven E-Mails schneller und komfortabler zu machen. Eine Einführung in MJML mit Live-Demo finden Sie hier. Sie sparen eine ganze Menge Zeit und vereinfachen Prozesse.

 

MJML – das Werzeug für schnellere und bessere Gestaltung von responsiven E-Mails

Flexibilität und Personalisierung sind heute Voraussetzung im E-Mail Marketing. Transaktionale E-Mails setzen immer komplexere Fachkenntnisse voraus. Oftmals resultiert dies darin, dass mehrere unterschiedliche Vorlagen zum Einsatz kommen. Die Lösung wäre eine personalisierte Vorlage, die sich den verschiedenen Zielgruppen und Einsatzgelegenheiten variabel anpasst. Separate Vorlagen zu benutzen, um Männer oder Frauen anzusprechen oder unterschiedliche Follow-Up Kampagnen durchzuführen, ist nicht effizient.

Ja, senden Sie mir den Mailjet Newsletter zu. Ich bin ausdrücklich damit einverstanden, den Newsletter zu erhalten und weiß, dass ich mich jederzeit problemlos wieder abmelden kann.

Mailjet Newsletter abonnieren

Ja, senden Sie mir den Mailjet Newsletter zu. Ich bin ausdrücklich damit einverstanden, den Newsletter zu erhalten und weiß, dass ich mich jederzeit problemlos wieder abmelden kann.

 

Hier kommt eine nutzerfreundliche Template Sprache ins Spiel. Eine solche könnte man zwar mit viel Einsatz auch programmieren. Doch dafür bräuchte man fundierte Programmierkenntnisse. Natürlich könnte man auch Libraries wie Handlebars, Jinja oder Twig nutzen. Aber selbst dann wäre noch eine eigene Template-Engine notwendig.

Bei Mailjet kennen wir den Nutzwert einer vollständig integrierten Template Sprache und haben daher unsere eigene entwickelt. Natürlich mit unserer Transactional API im Hinterkopf. Unsere Idee: Eine variable Vorlage für alle Gelegenheiten mit nur einem API Call.

MJML dient zur Erstellung mobiltauglicher E-Mails plus einer Template Sprache, um diese durch den Einsatz von Conditionals und Variablen zum Leben zu erwecken. Im Folgenden zeigen wir Ihnen, wie das Zusammenspiel funktioniert.

Ab sofort geben wir Ihnen im Blog regelmäßig Schritt-für-Schritt Anleitungen, die Ihnen zeigen, wie Sie optimale transaktionale E-Mails erstellen. Jedem Tutorial liegt ein alltäglicher Anwendungsfall zugrunde. Zusätzlich geben wir Ihnen zahlreiche Beispiele, Codeschnipsel und schicke Grafikbeispiele an die Hand. Ebenfalls stellen wir Ihnen ein Live-Testing Tool zur Verfügung. Hierfür benötigen Sie lediglich gültige Zugänge zur MJML API und der Mailjet Transactional Send API. Diese sind kostenfrei.

Heute beginnen wir mit unserem ersten Beispiel: Einer Rechnungs E-Mail, wie sie aus einem Onlineshop stammen könnte.

 

Einführung: Eine e-Commerce Rechnung per E-Mail schicken

Online Business wie Schuh-Onlineshops, Musik-Downloadplattformen etc. müssen bei einem Verkauf eine Rechnung per E-Mail versenden. Hier sind einige Faktoren zu berücksichtigen. Lassen Sie uns diese kurz betrachten, bevor wir zum eigentlichen Tutorial kommen.

  1.   Der Inhalt des Warenkorbs ist zu übermitteln und auszugeben.
  2.   Endpreis, Steuern und Versand sind eventuell direkt im Template zu berechnen. Dies wird besonders dann anspruchsvoll, wenn in mehrere Länder verkauft wird.
  3.   Weitere Daten wie beispielsweise Rechnungsadresse, Bestellnummer usw. Gilt es einzufügen. Optional werden Zusatzinfos bereitgestellt, z.B. ein Hinweis an den Kunden, dass seine Kreditkarte bald abläuft.
  4.   Die Versandadresse ist anzuzeigen.
  5.   Der Nutzer möchte die Mail sicher an die Buchhaltung weiterleiten. Dies sollte ohne Qualitätsverlust möglich sein.
  6.   Upselling Maßnahmen werden ggf. eingebunden, beispielsweise verwandte Produkte oder Aktionswaren.
  7.   Wenn Ihre Website mehrsprachig ist, sollten es die E-Mails natürlich auch sein.

 

Der Anwendungsfall

Nehmen wir an, es gäbe einen Onlineshop für Männermode unter bspshop-maennermode.com, der folgende Anforderungen an seine E-Mail Vorlage stellt:

  • Alle gekauften Artikel werden angezeigt.
  • Sämtliche Rechnungsinformationen (Rechnungs- und Versandadresse, Bestellnummer, Preis inkl. Steuern) sind vorhanden.
  • Eine Liste neuer Produkte werden angezeigt, um die Verkäufe zu erhöhen.

Hierzu steht uns eine Datei variables.json zur Verfügung, die die Demo-Daten beinhaltet. Der Designer gibt folgendes Layout vor:

Beispiel Newsletter E-commerce Kleidung 
 

Schritt-für-Schritt-Anleitung

 

Die Kopfzeile

Wir beginnen mit der Kopfzeile, dem sogenannten Header. Dieser besteht aus zwei Bildern: dem Logo sowie dem Schriftzug “Thanks” (Danke).

 

Beispiel Header - Logo und Schriftzug
 

Das für die Rechnungs E-Mail benötigte Layout ist einfach: lediglich zwei Mal das Bild-Element <mj-image>, welche sich wie Blöcke verhalten und in der Standardeinstellung zentriert sind. Diese beiden Bilder befinden sich in einem einspaltigen Tabellenelement <mj-column>.

Mittels des aus CSS bekannten padding-top Attributs legen Sie den Abstand zum oberen Rand fest.

Vergessen Sie nicht das alt-Attribut, das den Inhalt der Bilder beschreibt. Dieses ist wichtig, falls die Bilder im Mailprogramm Ihres Nutzers nicht angezeigt werden. Der entsprechende Code (mit Dummibilder) sieht folgendermaßen aus:

<!– Logo –>
<mj-section mj-class=”section-white” padding-top=”30px”>
 <mj-column>
   <mj-image src=”https://bit.ly/mj-tpl-tuto-logo-full” width=”100px” alt=”logo”/>
   <mj-image src=”https://bit.ly/mj-tpl-tuto-thanks” width=”90px” alt=”thanks!” padding-top=”20px”/>
 </mj-column>
</mj-section>

 

Die Begrüßung

Die Nutzer erwarten heutzutage eine zeitnahe und persönliche Kundenkommunikation. Dies gilt auch bei Rechnungen per E-Mail. Neben der Versandbestätigung ist die Rechnungs E-Mail diejenige Art E-Mail mit der höchsten Öffnungsrate. Die Template Sprache erlaubt es Ihnen, Variablen zu benutzen, um Ihre Vorlage mit eigenen Daten zu füllen.

Beispiel Ansprache
 

Erinnern Sie sich an dieser Stelle an die Datei mit den Demo-Daten. Sie greifen mittels folgenden Schemas auf die dort enthaltenen Inhalte zu:

{{ var:property_key:default_value }}.

An dieser Stelle benötigen Sie den Namen des Kunden, in diesem Falle “Matthias”. Mit dem Platzhalter {{ var:user.name }} fügen Sie automatisiert den Kundennamen ein.

Nun setzen wir diesen Platzhalter in den Begrüßungstext ein. Der Text-Tag <mj-text> ist standardmäßig links ausgerichtet. Innerhalb dieses Tags verwenden Sie HTML-Elemente wie <br/> für Zeilenumbrüche oder <a> für Links.

<!– Hallo und danke –>
<mj-section mj-class=”section-white” padding-top=”30px”>
 <mj-column>
   <mj-text>
     Hallo {{ var:user.name }},<br />
     vielen Dank für Ihre Bestellung. Nachfolgend finden Sie alle Details. <br />

Bei Fragen stehen wir Ihnen gerne zur Verfügung. Schreiben Sie uns einfach eine <a href=”mailto:kontakt@bspshop-maennermode.com“>E-Mail</a>.
   </mj-text>
 </mj-column>
</mj-section>

 

Rechnungs- und Versandadresse

Nun ist es an der Zeit, Rechnungsnummer und Adressen einzubinden.

Beispiel Darstellung Rechnungsadresse
 

Das hier verwendete Layout ist in zwei Abschnitte unterteilt. Der erste beinhaltet ein einspaltiges Element mit Text. Mittels einer Variable wird die Bestellnummer dargestellt.

Der zweite Abschnitt benutzt einen zweispaltigen Aufbau. Wenn Sie keine spezifischen Angaben machen, wird die Breite der Spalten gleichmäßig über den Inhaltsbereich aufgeteilt. Wenn Sie einen Blick auf die Variablen werfen, stellen Sie fest, dass sie diese komfortabel in den Fließtext einbinden können.

<!– Bestellnummer –>
<mj-section mj-class=”section-white”>
 <mj-column>
   <mj-text>
     <strong>Bestellnummer: {{ var:order.number }}</strong>
   </mj-text>
 </mj-column>
</mj-section>

<!– Rechnungs- und Versandadresse –>
<mj-section mj-class=”section-white”>
 <mj-column>
   <mj-text>
     <strong>Rechnungsadresse</strong><br />
     {{ var:user.address.billing_address.full_name }}<br />
     {{ var:user.address.billing_address.address_line_1 }}<br />

     {{ var:user.address.billing_address.postal_code }} &nbsp;
     {{ var:user.address.billing_address.city }},&nbsp;
     {{ var:user.address.billing_address.country }}&nbsp;
 
   </mj-text>
 </mj-column>
 <mj-column>
   <mj-text>
     Versandadresse<br />
     {{ var:user.address.billing_address.full_name }}<br />
     {{ var:user.address.billing_address.address_line_1 }}<br />
     {{ var:user.address.billing_address.postal_code }} &nbsp;
     {{ var:user.address.billing_address.city }},&nbsp;
     {{ var:user.address.billing_address.country }}&nbsp;
   </mj-text>
 </mj-column>
</mj-section>

 

Ausgabe der bestellten Artikel

Die Demo beinhaltet einen Datensatz mit drei Artikeln. Da Kunden jedoch nicht immer dieselben Produkte und dieselbe Menge kaufen, muss zunächst ein Produkt-Loop in der JSON Datei geschaffen werden. Idealerweise wird dieser bereits von Ihrem Onlineshop System generiert. Beispiel aus der Demo-Datei:

“items”: [
 {
   “title”: “Braune Schuhe”,
   “image_URL”: “http://bit.ly/mj-tpl-tuto-shoes”,
   “price”: {
     “currency”: “€”,
     “separator”: “,”,
     “amount”: 79,99
   },
   “size”: “45”,
   “quantity”: 1
 },
 {
   “title”: “Blaues T-Shirt”,
   “image_URL”: “http://bit.ly/mj-tpl-lang-tuto-tshirt”,
   “price”: {
     “currency”: “€”,
     “separator”: “,”,
     “amount”: 29,99
   },
   “size”: “S”,
   “quantity”: 1
 },
 {
   “title”: “Helles blues T-Shirt”,
   “image_URL”: “http://bit.ly/mj-tpl-lang-tuto-shirt”,
   “price”: {
     “currency”: “€”,
     “amount”: 24,99
   },
   “size”: “S”,
   “quantity”: 1
 }
]

Im nächsten Schritt fügen wir eine Schleife in die Vorlage ein, welche die Daten aus der JSON Datei ausliest. Diese Schleife beginnt mit {% for single_element in array_variable %} und endet mit der Anweisung {% endfor %}.

Innerhalb der Schleife erstellen wir die Variable single_element für jede Iteration. Den Zugriff darauf erklären wir gleich. Bitte beachten Sie, dass der Template-Code für Schleifen in den Tag <mj-raw> integriert werden muss, damit MJML diesen während der Umwandlung in HTML nicht entfernt.

<mj-raw>
 {% for item in var:order.items %}
</mj-raw>
 <mj-section mj-class=”section-white” vertical-align=”middle”>
   …
 </mj-section>
<mj-raw>
 {% endfor %}
</mj-raw>

Nun sorgen wir dafür, dass der Inhalt des Loops, also die bestellten Produkte im E-Mail Inhalt ausgegeben werden. Dies könnte so aussehen:

Beispiel Abbildung der Bestellung
 

Hierfür verwenden wir eine <mj-section> pro Artikel.

Jeder Abschnitt ist aus drei Spalten zusammengesetzt, welche das Produktbild, die Informationen (Titel, Größe, Menge) und den Preis ausgeben. Da das Element “item” genannt wurde, greifen wir mit der Syntax {{ item.property_key }} direkt darauf. Auf diese Weise wird z.B. die Bildquelle des <mj-image> Tags automatisch mit der korrekten Bilddatei ersetzt.

Die “item” Variable folgt den selben Regeln wie alle anderen. So fügen wir die definierten Werte und Eigenschaften hinzu.

<mj-section mj-class=”section-white” vertical-align=”middle”>
 <!– Bild –>
 <mj-column vertical-align=”middle” width=”30%”>
   <mj-image
     padding=”25px”
     align=”left”
     mj-class=”img-bordered”
     src=”{{ item.image_URL }}”
     alt=”{{ item.title }}”
     width=”150px”
   />
 </mj-column>
 <!– Data –>
 <mj-group vertical-align=”middle” width=”70%”>
   <mj-column>
     <mj-text align=”left”>
       <strong>{{ item.title }}</strong><br />
       Größe: {{ item.size }}<br />
       Menge: {{ item.quantity }}
     </mj-text>
   </mj-column>
   <!– Price –>
   <mj-column>
     <mj-text align=”right”>
       <strong>Preis: {{ item.price.currency }}{{ item.price.amount }}</strong>
     </mj-text>
   </mj-column>
 </mj-group>
</mj-section>

Sehen wir uns das Resultat der fertigen Produktschleife einmal an:

Beispiel Liste der Produkte

Rechnungsbeträge ausweisen

Jetzt gilt es, den Rechnungsendbetrag sowie die einzelnen Posten für Steuern und Versand anzuzeigen.

Beispiel Darstellung der zu zahlenden Summe
 

In der Beispieldatei finden wir die Variable order.sales_taxes_percentage mit dem Wert 0.19, was 19% entspricht. Hiermit berechnen wir aus dem Warenpreis die Steuern und den Endpreis.

Hierzu benötigen wir nur ein paar mathematische Grundkenntnisse:

Warenpreis * Steuersatz => 134,97 * 0,19 => 25,64.

Und da der Preis auf zwei Nachkommastellen gerundet werden soll, nutzen wir die Round(n, precision) Funktion für die Darstellung.

<!– Zustellbarkeit und Gesamtsumme –>
<mj-section mj-class=”section-white”>
 <mj-column width=”66%”>
   <mj-text>
     Ihr voraussichtlicher Liefertermin:<br />
     {{ var:order.delivery_date }}
   </mj-text>
 </mj-column>
 <mj-column width=”34%”>
   <mj-text align=”right”>
     Versand: {{ var:order.shipping.currency }}{{ var:order.shipping.amount }}<br />
     Mehrwertsteuer: {{ var:order.total.currency }}{{ Round(var:order.total.amount * var:order.sales_taxes_percentage, 2) }}<br />
     Gesamt: {{ var:order.total.currency }}{{ var:order.total.amount }}
   </mj-text>
   <mj-text align=”right”>
     <a href=”#View_Online_Receipt” target=”_blank”>Quitting online ansehen</a>
   </mj-text>
 </mj-column>
</mj-section>

 

Upselling

Natürlich möchten wir, dass der Kunde bald wieder bei uns bestellt. Hierfür stellen wir ihm am Ende der Rechnungs E-Mail noch passende neue Produkte vor. Auch dies lösen wir wieder mit einer Schleife, deren Daten in der JSON Datei hinterlegt sind.

Beispiel zusätzliche Produkte vorschlagen
 

<!– Ähnliche Artikel –>
<mj-section mj-class=”section-white” padding-top=”30px”>
 <mj-column width=”25%”>
     <mj-divider mj-class=”divider-simple” />
 </mj-column>
 <mj-column width=”50%”>
     <mj-text font-size=”20″ padding=”0px” align=”center” color=”#999999″>
       <span style=”letter-spacing:3px”>DAS KÖNNTE IHNEN AUCH GEFALLEN</span>
     </mj-text>
 </mj-column>
 <mj-column width=”25%”>
     <mj-divider mj-class=”divider-simple” />
 </mj-column>
</mj-section>

<!– Suggestions –>
<mj-section mj-class=”section-white” padding-top=”30px”>
 <mj-raw>
   {% for suggestion in var:suggestions %}
 </mj-raw>
 <!– Vorsicht mit der Artikelanzahl! –>
   <mj-column>
     <mj-image
       padding=”20px”
       mj-class=”img-bordered”
       src=”{{ suggestion.image_URL }}”
       href=”{{ suggestion.link }}”
       alt=”{{ suggestion.title }}”
     />
   </mj-column>
 <mj-raw>
   {% endfor %}
 </mj-raw>
</mj-section>

 

 

Fußzeile

Nun müssen wir die Mail nur noch mit einem Footer, also einer Fußzeile abschließen.

Beispiel Fußzeile
 

Hier ist der Kniff, dass wir kein Untereinander-Rutschen der Spalten auf Mobilgeräten möchten. Dafür ist das Element <mj-group> die passende Lösung. Informationen dazu finden Sie in der Dokumentation.

<mj-section mj-class=”section-white” vertical-align=”middle” padding-bottom=”30px”>
 <mj-group>
   <mj-column width=”31%” vertical-align=”middle”>
     <mj-image src=”https://bit.ly/mj-tpl-tuto-logo-full” width=”20px” alt=”logo” align=”right”/>
   </mj-column>
   <mj-column width=”38%” vertical-align=”middle”>
     <mj-text align=”center” font-style=”italic” padding=”0″>
       <a href=”bspshop-maennermode.com/questions” target=”_blank”>Haben Sie Fragen?</a>&nbsp;
       <a href=”bspshop-maennermode.com” target=”_blank” style=”color: #763b26; text-decoration: none”>Männermode</a>
       <span style=”color: #763b26″>&nbsp;•</span>
     </mj-text>
   </mj-column>
   <mj-column width=”31%” vertical-align=”middle”>
     <mj-image src=”https://bit.ly/mj-tpl-tuto-twitter” width=”25px” alt=”logo” align=”left”/>
   </mj-column>
 </mj-group>
</mj-section>

 

Fazit

Sie haben nun Ihre erste eigene E-Mail Vorlage mit MJML und unserer Template Sprache erstellt. Teilen Sie uns Ihr Feedback zum ersten Tutorial gerne auf Facebook oder Twitter mit! Sie möchten über weitere Tutorials auf dem Laufenden bleiben? Dann abonnieren Sie unseren Newsletter für Entwickler.