Templating Guidelines

    Newsletter werden zwar prinzipiell in HTML gebaut und mit CSS gestaltet, allerdings werden diese von den unterschiedlichen Mail-Clients recht unterschiedlich gerendert.

    Um eine möglichst große Kompatibilität zu erreichen, kann man deshalb leider nicht alle Möglichkeiten von HTML5 und CSS3 ausschöpfen.

    Auch die responsive Darstellung ist bei manchen Clients nicht möglich, da diese keine Media Queries unterstützen oder teilweise fix vorgegebene Breiten benötigen.

    Tipp

    Frisch installierte Newsletter

    Bei frisch installierten Newslettern wird eine richtig aufgebaute Index.html bereits angelegt.

    Hier sind bereits alle notwendigen Voraussetzungen erfüllt. Allerdings müssen natürlich bei Anpassung der Schriftstile, Verwendung anderer Schriftarten und der Anpassung des Templates die allgemeinen CSS-Styles und die Media Queries dementsprechend geändert oder ergänzt werden.

    Aufbau Index.html

    Um die maximale Kompatibilität und den vollen Umfang der Funtkionen des Bakehouse zu garantieren, sind bestimmte Voraussetzungen - manchmal auch in der richtigen Reihenfolge - einzuhalten.

    So werden an manchen Stellen spezielle Conditions benötigt, die den umschlossenen Code nur für bestimmte Clients relevant machen.
    Diese können wir folgt aussehen:

    HTML
    <!--[if mso]> ### CODE FÜR MICROSOFT OUTLOOK ### <![endif]--> <!--[if (mso)|(mso 16)]> ### CODE FÜR GEWISSE MICROSOFT OUTLOOK VERSIONEN ### <![endif]--> <!--[if lte mso 11]> ### CODE FÜR GEWISSE MICROSOFT OUTLOOK VERSIONEN ### <![endif]--> <!--[if !mso]><!--> ### CODE FÜR ALLE AUSSER MICROSOFT OUTLOOK ### <!--<![endif]-->

    Diese Conditions werden meistens durch die Verwendung der Newsletter-ViewHelper automatisch gesetzt, sie werden aber auch für die allgemeinen CSS-Styles und Media Queries, die zu Beginn der Index.html gesetzt werden, benötigt.

    Um eine Vorstellung zu bekommen, was in der Index.html-Datei benötigt wird und wie diese aufgebaut sein muss, sehen wir uns zunächst ein vereinfachtes, exemplarisches Beispiel an:

    HTML
    {namespace bh=TYPO3\Bh\ViewHelpers} {namespace nl=TYPO3\BhNewsletter\ViewHelpers} <nl:preHeader/> <!--[if mso]> <style type="text/css"> h1, h2 { font-family: Georgia, serif !important; } h3 { font-family: Arial, Helvetica, sans-serif !important; } .img-for-mobile { height: 0px !important; display: none; } </style> <![endif]--> <!--[if (mso)|(mso 16)]> <style type="text/css"> a.buttonLink {text-decoration: none;} </style> <![endif]--> <style type="text/css"> body { margin:0;padding:0;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background-color:#fff; } table, td { border-collapse:collapse;mso-table-lspace:0pt;mso-table-rspace:0pt; } img { border:0;height:auto;line-height:100%; outline:none;text-decoration:none;-ms-interpolation-mode:bicubic; } p { display:block;margin:13px 0; } h1, h2 { font-family: Georgia, serif !important; } h3 { font-family: Arial, Helvetica, sans-serif !important; } </style> <!--[if !mso]><!--> <style type="text/css"> @media only screen and (max-width:480px) { @-ms-viewport { width:320px; } @viewport { width:320px; } } </style> <!--<![endif]--> <!--[if lte mso 11]> <style type="text/css"> .outlook-group-fix { width:100% !important; } </style> <![endif]--> <f:render partial="MediaQueries" arguments="{_all}" /> <style type="text/css"> @media screen and (min-width:480px) { div, p, a, li, td { -webkit-text-size-adjust: none;-moz-text-size-adjust: none;-ms-text-size-adjust: none;text-size-adjust: none; } } </style> <style type="text/css"> @media (max-width:480px) { table.full-width-mobile, .nlColLeft, .nlColRight { width: 100% !important; } td.full-width-mobile { width: auto !important; } div, p, a, li, td { -webkit-text-size-adjust: none;-moz-text-size-adjust: none;-ms-text-size-adjust: none;text-size-adjust: none; } td.mobileNoDisplay { display: none !important; width: 0px !important; } td.mobileFullWidth { width: 100% !important; } ### Mediaqueries des Templates } </style> <div style="background-color:#ffffff;"> ### HTML des Templates </div> <img class="piwiktracking" src="https://stats.bakehouse.at/piwik.php?idsite=873&rec=<f:cObject typoscriptObjectPath="lib.trackOnlyWhenSent"></f:cObject>&url=<f:format.urlencode>https://www.seespitz.at/nl_geoeffnet/<f:cObject typoscriptObjectPath="lib.pagetitle"></f:cObject></f:format.urlencode>/###EMAIL###&action_name=newsletter_geoeffnet&pk_campaign=newsletter_geoeffnet" style="border:0;" alt="" />

    Gehen wir nun das HTML von oben nach unten durch und sehen uns die einzelnen Teile genauer an:

    Zu Beginn müssen wir natürlich die richtigen Namespaces setzen. Für jeden Newsletter benötigen wir den Namespace des Bakehouse und natürlich der Newsletter-Erweiterung. Sollen im Newsletter auch die News- oder Booking-Erweiterungen ausgegeben werden, müssen natürlich auch diese Namespaces aufgeführt werden.

    Als nächstes folgt der preHeader-ViewHelper. Dieser liest die SEO-Description der Newsletter-Seite aus und gibt sie als unsichtbaren Text am Beginn des Newsletters aus. Da die meisten Mail-Clients neben dem Betreff einer Mail auch einen Teil des ersten Textes als Vorschau anzeigen, kann so durch Befüllung der SEO-Description Einfluss auf dieses Verhalten genommen werden.

    Im nächsten Block finden wir 2 Outlook-Conditions, in denen die Schriftstile definiert werden. Außerdem finden sich hier CSS-Styles, die für das allgemeine Template benötigt werden.

    Nun folgt ein CSS-Block, der allgemeine CSS-Styles für alle "nicht Outlook"-Clients bereithält. Hier müssen gegebenenfalls auch die Schriftstile ergänzt oder angepasst werden.

    Die nächste Condition wird wieder für das allgemeine Template benötigt.

    Der nun folgende <f:render ... wird nur benötigt, wenn im Template die Elemente aus dem Bakehouse-Core verwendet werden. Dieser rendert die Media Queries für die verwendeten Contentelemente. Genauere Informationen zur Verwendung der Core-Elemente

    Die nächsten 2 Blöcke beinhalten die Mediaqueries für die Anzeige auf Devices, deren Displaybreite größer als 480px oder eben kleiner als 480px ist. Hier können alle Styles ergänzt werden, die durch Anpassung des Templates und der Styles der Core-Elemente benötigt werden.

    Nun folgt der sichtbare Teil des Templates, also die Grundstruktur, die immer gleich bleibt - Header, Footer und die Contentbereiche.

    Zum Schluss folgt ein img-Tag, der für das Tracking benötigt wird.

    Achtung

    Tracking-Pixel am Ende des Templates

    Vor dem Go-Live sollte hier sichergestellt werden, dass die richtige Piwik-ID und auch die richtige URL mitgegeben werden!

    Das Template und die Verwendung der ViewHelper

    Sehen wir uns nun den sichtbaren Teil des Templates an.
    Beginnen wir mit einem exemplarischen Beispiel. Im folgenden Code haben wir einen Header mit dem Logo und dann 2 Contentbereiche.

    HTML
    <div style="background-color:#ffffff;"> <nl:section full-width="true" width="600" padding="20px 0px 20px" class="header"> <nl:cols.row padding="0px"> <nl:cols.col padding="0px" class="header-logo"> <table width="100%" align="center" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr width="100%" style="width:100%;text-align: center;"> <td class="logoTop" align="center" width="100%" style="direction:ltr;width:100%;text-align: center;"> <div style="text-align:center;direction:ltr;display:block;vertical-align:top;width:100%;"> <f:link.page absolute="true" pageUid="1" style="display:inline-block;"> <img class="header-logo-img" height="auto" src="/fileadmin/templates/ext/bh_newsletter/images/cookis_blau.png" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:200px;" width="200" alt="Cookis Webworks"> </f:link.page> </div> </td> </tr> </tbody> </table> </nl:cols.col> </nl:cols.row> </nl:section> <div class="header-content"> <bh:tmpl.content section="nlheadercontent" label="Header" type="noinherit"/> </div> <div class="content"> <bh:tmpl.content section="nlcontent" label="Content" type="noinherit"/> </div> </div>

    Da wir im Newsletter beim Layouting nicht mit Flexbox und ähnlichen Layout-Techniken arbeiten können, muss hier auf die Verwendung der ViewHelper und des altbewährten table Elements zurückgegriffen werden.

    Hinweis

    Newsletter ViewHelper

    Jeglicher Content, der hardcoded im Template ist, sollte immer innerhalb eines Section-ViewHelpers und einem Row- und einem Col-ViewHelper liegen!

    Da die Elemente ebenfalls mit den ViewHelpern aufgebaut sind, müssen die Contentbereiche ohne Breitenbeschränkung nur von einem div Element/Container umschlossen im Template liegen.

    Achtung

    Namen der Contentbereiche

    Die Namen der Contentbereiche müssen immer wie folgt genannt werden:

    • nlheadercontent (Header Content)
    • nlcontent (Main Content)
    • nlfootercontent (Footer Content)

    CSS & Media Queries

    Beim Verschicken des Newsletters werden HTML und CSS gemergt. Das erhöht die Darstellungsqualität bei schlechteren Mail-Clients. Dabei werden alle im Newsletter inkludierten CSS-Dateien ausgelesen und als inline-CSS direkt in das HTML geschrieben.

    Das bedeudet, dass das Styling mit CSS prinzipiell in der CSS-Datei des Templates erfolgen kann. Da das endgültig gerenderte HTML aber durchaus komplex mit zahlreichen Verschalchtelungen sein kann, ist es manchmal einfacher die Styles im Template selbst direkt inline zu setzen.

    Da viele Clients (vor allem ältere Outlook-Varianten) weder Media Queries noch CSS, das nicht inline ist, interpretieren können, muss der Newsletter ohne Einsatz der Media Queries als Desktopversion mit fixer Breite funktionieren. Das bedeutet, dass die Mobileversion immer als Erweiterung durch die Media Queries gedacht werden muss.

    Da das CSS der Desktopvariante als inline-CSS im HTML steht, müssen die Media Queries entweder mit stärkerer Definition oder mit !important gesetzt werden.

    "No-Gos" beim Newsletter-Coding

    Leider können einige Techniken, die man gewohnt ist, aufgrund mancher Clients nicht verwendet werden. Im Folgenden eine kurze Aufzählung:

    • background-image
    • Pseudo-Elemente wie ::before oder ::after
    • Flexbox, Grid
    • DOM-Elemente, die als display: inline; gedacht waren, können in manchen Clients nicht mit anderen display-Werten wie beispielsweise display: block; überschrieben werden.
    • CSS-Werte, die mit !important gesetzt werden, werden von manchen Outlook Clients ignoriert.
    Achtung

    Links im Newsletter

    Alle Links müssen absolut sein!
    Bei den Link-ViewHelpern kann hierfür absolute="true" mitgegeben werden.

    Placeholder für Personalisierung

    Mit folgenden Placeholdern können Mappings zu Feldern des Empfänger:innen-Kontaktes hergestellt werden. Beim Versenden des Newsletters wird der Tag automatisch mit dem entsprechenden Wert überschrieben.

    PlaceholderBeschreibung
    ###ANREDE###Personalisierte Anrede (so wie im Interface definiert)
    ###FIRSTNAME###Vorname
    ###LASTNAME###Nachname 
    ###NAME###Name
    ###TITEL###Titel 
    ###EMAIL###E-Mail-Adresse
    ###BESCHREIBUNG###Beschreibung
    ###DOUBLEOPTINLINK###Link um das Double Opt-In zu bestätigen
    ###UNIQID###Eindeutige ID basierend auf Microtime (php: uniqid)

    Folgende Felder können auch base64 Codiert abgefragt werden:

    PlaceholderBeschreibung
    ###FIRSTNAMEBASE64###Vorname
    ###LASTNAMEBASE64###Nachname
    ###NAMEBASE64###Name 
    ###TITELBASE64###Titel
    ###EMAILBASE64###E-Mail-Adresse
    ###BESCHREIBUNGBASE64###Beschreibung

    Allgemeine Anmerkungen

    Eine Sache, die auch einen noch so gut programmierten Newsletter leider zerstören kann, ist das Verhalten des Gmail Webclients. Dieser hat ein Limit an Zeichen, die angezeigt werden. Wird dieses Limit überschritten, so schneidet Google den Newsletter einfach ab - ohne Rücksicht auf HTML-Tags. Daher kann es passieren, dass im Gmail Webclient ein Newsletter komplett falsch dargestellt wird. Es ist somit nie von Nachteil, bei der gesamten Programmierung auf die Länge des Codes zu achten.

    Auch der Spam-Score sollte beim Newsletter nicht vergessen werden! Dieser kann bereits vom/von der Integrator:in positiv oder auch negativ beeinflusst werden.
    Folgende Punkte verschlechtern den Spam-Score:

    • fehlende alt-Attribute bei Bildern
    • Tracking-Pixel im Code
    • Verwendung von JavaScript & includes von JS-Dateien
    • kaputte Links
    • Links ohne https
    Notiz

    Zum Schluss gilt beim Newsletter-Coding...

    ...das Wichtigste ist Testen, Testen, Testen - am besten auf so vielen unterschiedlichen Clients wie möglich!