Bilder in tt_news Detailansicht in unterschiedlichen Markern & Größen

Dienstag, 5. Januar 2010 16:24

In der Detailansicht einer News kann man die Bilder in unterschiedlichen Größen und verschiedenen Markern ausgeben. Dafür legt man folgende Konfiguration an im TypoScript-Setup:

plugin.tt_news {
  imageMarkerOptionSplit = 1|*|2
  image.file.maxW = {$plugin.tt_news.singleMaxW}|*|100
}

Mit der Einstellung “imageMarkerOptionSplit” kann man die Bilder auf verschiedene Marker verteilen, Marker “NEWS_IMAGE_1″ enthält das erste Bild, “NEWS_IMAGE_2″ alle anderen Bilder. Im HTML-Template der News-Detailansicht stehen einem nun also diese Marker zur Verfügung:

###NEWS_IMAGE_1###
###NEWS_IMAGE_2###

Auch bei der Einstellung für die Bildbreite (image.file.maxW) wird “optionSplit” eingesetzt, so dass alle Bilder (außer dem ersten Bild) in 100 Pixel Breite gerendert werden.

Übrigens: Man kann für alle TypoScript-Einstellungen der News “optionSplit” einsetzen – der komplette Konfigurations-Array wird in Datei “pi/class.tx_ttnews.php” an die Funktion “processOptionSplit” übergeben!

Achtung: Die Einstellung “imageMarkerOptionSplit” wird nur beachtet, wenn die Einstellung “imageMarkerFunc” nicht genutzt wird (z.B. Lightbox-Extensions nutzen diese gerne).

Thema: Beruflich, Knowhow, TYPO3 | Kommentare (0)

Datensätze über TYPO3 Backend-Modul anlegen

Dienstag, 17. November 2009 17:42

Wenn man über ein Backend-Modul Datensätze anlegt oder ändert, sollte man nicht einfach selber eine INSERT-Query schreiben, sondern die Funktionalität von TYPO3 nutzen. Bei Frontend-Plugins steht einem hierfür die globale Variable TYPO3_DB zur Verfügung. Für das Backend gibt es so etwas aber nicht, hier muss man etwas kreativer sein. Nach langer Einarbeitung in den TYPO3 Code und vielen Versuchen bin ich auf die recht simple Lösung gekommen:

/**
 * Functions to use TYPO3 functionality for BE modules
 *
 * @author Sven Burkert (sventb@googlemail.com)
 */
class t3lib_db {
	/**
	 * Insert new record
	 *
	 * @param string $table: table of new record
	 * @param array $fieldValues: values to insert, key is column of value
	 */
	public function t3lib_db_insert($table, array $fieldValues) {
		$datamap = array($table => array(uniqid('NEW') => $fieldValues));
		$this->t3lib_process($datamap);
	}

	/**
	 * Update existing record
	 *
	 * @param string $table: table of update record
	 * @param array $fieldValues: values to update, key is column of value
	 * @param integer $uid: uid of update record
	 */
	public function t3lib_db_update($table, array $fieldValues, $uid) {
		$datamap = array($table => array($uid => $fieldValues));
		$this->t3lib_process($datamap);
	}

	/**
	 * Delete a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of delete record
	 */
	public function t3lib_db_delete($table, $uid) {
		$this->t3lib_process(array(), array($table => array($uid => array('delete' => true))));
	}

	/**
	 * Undelete a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to restore
	 */
	public function t3lib_db_undelete($table, $uid) {
		$this->t3lib_process(array(), array($table => array($uid => array('undelete' => true))));
	}

	/**
	 * Move a record (to another page)
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to move
	 * @param integer $pid: new page id for record
	 */
	public function t3lib_db_move($table, $uid, $pid) {
		$this->t3lib_process(array(), array($table => array($uid => array('move' => $pid))));
	}

	/**
	 * Copy a record (to another page)
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to copy
	 * @param integer $pid: new page id for record
	 */
	public function t3lib_db_copy($table, $uid, $pid) {
		$this->t3lib_process(array(), array($table => array($uid => array('copy' => $pid))));
	}

	/**
	 * Localize a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record (default language) to localize
	 * @param integer $languageId: id of new language
	 */
	public function t3lib_db_localize($table, $uid, $languageId) {
		$this->t3lib_process(array(), array($table => array($uid => array('localize' => $languageId))));
	}

	/**
	* Process input
	*
	* @see t3lib_tcemain->process_datamap()
	* @param array $datamap: Data to be modified or inserted in the database
	*/
	private function t3lib_process(array $datamap, array $cmd = array()) {
		$t3lib_tcemain = t3lib_div::makeInstance('t3lib_tcemain');
		$t3lib_tcemain->start($datamap, $cmd);
		$t3lib_tcemain->process_datamap();
		$t3lib_tcemain->process_cmdmap();
	}
}

Diese Klasse kann man nun zum Anlegen neuer Datensätze,…

require_once(t3lib_extMgm::extPath('myExt') . 'class.t3lib_db.php');
$t3lib_db = new t3lib_db();
$t3lib_db->t3lib_db_insert(
	'myTableName',
	array(
		'pid' => $myPid,
		'title' => 'bla',
		'myField' => 'blubb'
	)
);

… zum Aktualisieren bestehender Datensätze und…

require_once(t3lib_extMgm::extPath('myExt') . 'class.t3lib_db.php');
$t3lib_db = new t3lib_db();
$t3lib_db->t3lib_db_insert(
	'myTableName',
	array(
		'pid' => $myPid,
		'title' => 'bla',
		'myField' => 'blubb'
	),
	$myUid
);

…zum Löschen von Datensätzen und…

require_once(t3lib_extMgm::extPath('myExt') . 'class.t3lib_db.php');
$t3lib_db = new t3lib_db();
$t3lib_db->t3lib_db_delete(
	'myTableName',
	$myUid
);

…zum Verschieben von Datensätzen usw. nutzen:

require_once(t3lib_extMgm::extPath('myExt') . 'class.t3lib_db.php');
$t3lib_db = new t3lib_db();
$t3lib_db->t3lib_db_move(
	'myTableName',
	$myUid,
	$newPid
);

Damit werden die Datensätze korrekt in die Tabelle eingefügt bzw. aktualisiert, d.h. mit den Timestamps, korrekten Wert für Feld “sorting” und korrektem Handling des Workspaces bzw. Versionierung (betrifft die Felder “t3ver_*”). Vor allem die Handhabung der Datensätze im Entwurfs-Workspace und anderen Workspaces wird damit erleichtert.
Beachten sollte man, dass man nun jedes Feld im TCA definieren muss, denn sonst werden die Werte für dieses Feld verworfen. Felder, die man nicht über das Backend abändern darf, kann man als “nur lesen” anlegen, z.B. so:

'config' => Array (
	'type' => 'input',
	'readOnly' => 1
)

oder so:

'config' => Array (
	'type' => 'select',
	'foreign_table' => 'myTable',
	'size' => 1,
	'readOnly' => 1
)

EDIT 09.03.2010: Habe eben den Artikel auf http://blog.tolleiv.de/2010/03/handling-data-in-typo3-with-tcemain/ entdeckt und die weiteren Funktionen (Datensatz verschieben, kopieren und übersetzen) nachgereicht.

Thema: Beruflich, Knowhow, TYPO3, Web Entwicklung | Kommentare (0)

Unterlassungserklärungen für Alfahosting

Samstag, 7. November 2009 11:32

Eigentlich bin ich ja zufrieden mit Alfahosting (bis auf das “kleine Missverständnis”, als sie mir mein Browserspiel sperrten): Sie sind günstig und vom Support bekommt man schnell Anwort.

Doch kürzlich wurde die Webseite eines Kunden gesperrt und das “Theater” mit dem ISP ging los. Begründung für die Sperrung war folgende:

“[...]Leider mussten wir Ihren Account sperren, da sehr viele Spam-E-Mails über ein kompromittiertes Skript versandt wurden. Bitte beachten Sie das Sie fahrlässig gegen unsere AGBs verstoßen. Wichtiger Hinweis: Eine erneute Sperrung ist mit erheblichen Kosten verbunden![...]“

Heimlich, still und leise haben sie die Webseite gesperrt, ohne einen Hinweis oder eine E-Mail-Benachrichtigung, weder nach Sperrung noch im Vorfeld.

Gut, dachte ich mir, die Webseite läuft TYPO3, da gibt es wohl eine Sicherheitslücke – doch weit gefehlt: Das “kompromittierte Skript” war das Kontaktformular! Dieses hatte keinen Spam-Schutz und deshalb haben es Spam-Bots fleissig genutzt. Millionen anderer Webseiten haben diese “Sicherheitslücke”. Also habe ich einen Spam-Schutz implementiert und Alfahosting geschrieben, dass ich keinen Verstoß gegen die AGB feststellen konnte und dass sie die Seite doch bitte wieder freischalten sollen. Doch Alfahosting stellte sich quer und wollte weiterhin die Unterlassungserklärung. Doch wie kann ich garantieren, etwas zu unterlassen, was nicht ich, sondern andere (Spam-Bots) machen? Außerdem kann jeder Spam-Schutz umgangen werden, es wäre also nur eine Frage der Zeit, bis ein halbwegs intelligenter Spam-Bot den Schutz umgehen kann.

Nach mehreren Nachrichten hin und her (Alfahosting hat meinen Standpunkt natürlich nicht verstanden) riet ich dem Kunden, am besten einen Anwalt einzuschalten oder die Unterlassungserklärung zu unterschreiben. Er hat letzteres getan.

Keine 24 Stunden, nachdem die Webseite wieder freigeschaltet war, hat Alfahosting sie erneut gesperrt: Es wurden erneut Spam-E-Mails über das Kontaktformular verschickt! Freundlicherweise hat Alfahosting mir eine dieser Spam-E-Mails gezeigt und dabei ist mir aufgefallen, dass diese E-Mail in der alten Form vorlag (der Spam-Schutz erfordert ein zusätzliches Feld, das in der E-Mail aufgeführt werden müßte). Als mögliche Erklärungen habe ich nur zwei: Entweder hat Alfahosting hier das Datum gefälscht oder der E-Mail-Server hatte noch ein paar Spam-Mails in seiner Queue und hat diese nach Freischaltung des Accounts weiter abgearbeitet.

Nun wollte Alfahosting erneut eine Unterlassungserklärung und 25 Euro für das Entsperren des Accounts. Diese haben wir natürlich “gerne” gezahlt und das Kontaktformular von der Webseite entfernt. Bei solch einem Verhalten seines ISP sollte man ihn am besten wechseln oder einen Anwalt einschalten… es geht doch nicht, dass man seine Kunden mit der gesperrten Webseite um ein Unterlassungserklärung und/oder Geld erpresst. Doch das wäre wieder mit etlichen Kosten und Zeitaufwand verbunden.

Thema: Beruflich, Ärgernisse | Kommentare (0)

Bilder werden im Extension-Manual im TER nicht angezeigt

Mittwoch, 12. August 2009 15:24

Wenn in dem Online-Dokument einer Extension die Screenshots oder andere Grafiken nicht angezeigt werden, hat man diese falsch eingebunden, z.B. per Drag&Drop.

Im Quellcode sieht der img-Tag dann wie folgt aus:

<img width="NaN" src="{TX_TERDOC_PICTURESDIR}20000007000047A7000045FFBF8F874F.svm"/>

Die Grafiken muss man jedoch über “Einfügen” -> “Bild” -> “Aus Datei…” in die sxw-Datei einfügen. Das wußte ich bisher nicht, das “TYPO3 Kochbuch” hat mich aufgeklärt.

Thema: Beruflich, Knowhow, TYPO3, Web Entwicklung | Kommentare (0)

Mein Seat

Mittwoch, 1. Juli 2009 12:09

Auktion bei ebay

Auktion bei ebay

Mit meinem geliebten rot-gelben Seat Ibiza habe ich letztes Jahr die Hauptuntersuchung bei TÜV in Mainz-Gonsenheim nicht bestanden. Ich habe den Eindruck, die sind etwas kleinlich, es wurde unter anderem bemängelt, dass man den Fahrersitz nicht umklappen, dass der Fensterheber nicht funktioniert und das Lenkrad etwas (1 bis 2 mm) Spiel hat. Die Reparaturen hätten mehr gekostet, als das Auto noch wert ist, deshalb habe ich es bei ebay für 330 Euro verkauft.

Für den mehr als 20fachen Betrag habe ich mir dann einen schwarzen Seat Leon zugelegt. Blöd nur, dass mir dieser Problemchen bereitet, kaum dass ich vom Hof des Händlers gefahren bin: Steinschlag in Scheibe, CD beim Radio funktioniert nicht, Anlasser funktioniert sporadisch nicht und der Keilriemen macht Schleifgeräusche… Ein paar Tage zuvor bei der Probefahrt war alles in Ordnung und der Gebrauchtwagencheck beim ATU in Heilbronn erbrachte auch keine Mängel.

Wieso bloß wollte der ATU in Mainz diese Teile komplett austauschen (minimum 150 Euro für Keilriemen und 250 Euro für Anlasser)? Das ausgezeichnete Autohaus Merkel hat es ohne Ersatzteile hinbekommen – gleich mal 400 Euro gespart. Bekommen die Mitarbeiter bei ATU eigentlich Provision, wenn sie naiven Autobesitzern das Geld aus der Tasche ziehen?

Thema: Privat, Ärgernisse | Kommentare (0)

Seiteninhalte vererben in TYPO3

Mittwoch, 1. Juli 2009 11:39

Oft macht es Sinn, auf verschiedenen Seiten die gleichen Inhalte anzubieten, z.B. Teaser oder Werbebanner im Randbereich einer mehrspaltigen Webseite.

Dabei sollte man natürlich nicht auf jeder Seite die gleichen Inhalte einpflegen, sondern die Inhalte vererben: Wenn die Inhaltsspalte der aktuellen Seite keinen Inhalt hat, wird der Inhalt von den Eltern-Seiten genommen. Die Vererbung funktioniert rekursiv, d.h. wenn auch die übergeordnete Seite keinen Inhalt hat, wird bei deren Eltern-Seite nachgeschaut usw.

Je nachdem, ob man TemplaVoila einsetzt oder nicht, muss man unterschiedlich vorgehen:

TYPO3 mit TemplaVoila

Vererbung mit der Extension kb_tv_cont_slide

In der TemplaVoila Datenstruktur wird der vorhandene TypoScript Code
mit diesem ersetzt:

10 = RECORDS
10.source.postUserFunc = tx_kbtvcontslide_pi1->main
10.source.postUserFunc.field = field_idOfTheField
10.source.postUserFunc.languageFallback = 0
10.tables = tt_content
field_idOfTheField ist ein Platzhalter und muss mit dem Namen der Inhaltsspalte ersetzt werden.

Vorteile der Extension gegenüber der Lösung mit TypoScript:

  • language fallback: Bevor auf die Inhalte der Eltern-Seite zurückgegriffen wird, wird geprüft, ob zu der angegebenen Sprache (im
    Beispiel 0, also die Default Sprache) Inhalte vorliegen.
  • Seitenelemente, für die die Verknüpfung entfernt wurden (d.h. sie wurden im Seiten-Modul “gelöscht”), werden nicht mehr angezeigt

Mehr zu dieser Extension im TYPO3 Repository

Über TypoScript

Dieser TypoScript Code kommt in die TemplaVoila Datenstruktur:

10 = CONTENT
10 {
  table = tt_content
  slide = -1
  select {
    where = colPos=0
    andWhere = deleted=0
    andWhere = hidden=0
    orderBy = sorting
  }
  wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->
}

Angepasst werden muss nur die colPos, hier kommt der Wert rein, der in Tag oldStyleColumnNumber steht.

ACHTUNG: Elemente, die gelöscht wurden (d.h. deren Verknüpfung wurde entfernt), werden trotzdem ausgegeben! Deshalb muss man immer die “nicht verwendeten Elemente” händisch löschen!

Die TypoScript Lösung habe ich hier gesehen.

TYPO3 ohne TemplaVoila

Hier kann man das sogenannte “Content Sliding” einsetzen. Dieses gibt es seit TYPO3 Version 4.

Mehr zum Content Slide im TYPO3-Wiki.

temp.myBorderCol < styles.content.getBorder
temp.myBorderCol.slide = -1

Mit dem “Content Sliding” ist es auch möglich, die Elemente von den Eltern-Seiten zu sammeln und alle auszugeben. D.h. je tiefer man navigiert, umso mehr Elemente werden angezeigt. Dies funktioniert mit “styles.content.getBorder.slide.collect”.

Thema: Beruflich, Knowhow, Snipplets, TYPO3, Web Entwicklung | Kommentare (0)

Texte aus TYPO3 Extensions

Montag, 20. April 2009 17:56

Wenn man auf seiner Webseite eine TYPO3 Extension einsetzt, ist man oft nicht immer einverstanden mit den Texten, Beschreibungen oder Übersetzungen. Diese kann man zwar einfach in der locallang-Datei der Extension (pi1/locallang.php oder pi1/locallang.xml) oder in den “Translation Handling” Dateien (Verzeichnis typo3conf/l10n/de/meineextension/pi1) abändern, falls die Texte nicht direkt im PHP Code stehen  (um diese Extensions sollte man aber generell einen weiten Bogen machen!).

Besser ist, wenn man diese Texte über TypoScript abändert, denn damit stellt man sicher, dass die Änderungen auch noch vorhanden sind, wenn man ein Update der Extension macht oder das Translation Handling ausführt. Hier die TypoScript Konfiguration am Beispiel der Extension “tt_news” und dem Text für Sprach-Key “more”:

plugin.tt_news._LOCAL_LANG.en.more = more
plugin.tt_news._LOCAL_LANG.de.more = mehr

Den entsprechenden Sprach-Schlüssel (hier “more”) findet man in den locallang-Dateien, die im vorliegenden Fall so aussieht:

[...]
<languageKey index="default" type="array">
	[...]
	<label index="more">[more]</label>
</languageKey>
<languageKey index="de" type="array">
	[...]
	<label index="more">[mehr]</label>
</languageKey>

Thema: Beruflich, Knowhow, TYPO3, Web Entwicklung | Kommentare (0)

Überschriften mit Umbruch in TYPO3

Montag, 20. April 2009 14:21

Manchmal erfordert das Screendesign, dass man Überschriften aus den Seitenelementen mehrzeilig darstellt.

Das geht ganz einfach – man muss diesen TypoScript-Code lediglich in das Setup-Feld (auf deutsch “Konfiguration”) eintragen:

// break row in headings (with hash: #)
lib.stdheader.10 {
  1 {
    split {
      token = ##
      cObjNum =  1 |*| 1 |*| 2
      1 = TEXT
      1.current = 1
      1.wrap = |<br>
      2 = TEXT
      2.current = 1
      2.wrap =
    }
  }
  2.split < .1.split
  3.split < .1.split
  4.split < .1.split
  5.split < .1.split
}

Nun kann man mit dem Raute-Zeichen einen Umbruch in Überschriften erzwingen.

edit: Da von der split-Anweisung auch die Links bei Überschriften betroffen sind, sollte man als token keine Zeichen verwenden, die in einem Link verwendet werden könnten, also z.B. # (eine Raute) oder _ (Unterstrich): <a target=”_blank” href=”#top” …>

Thema: Beruflich, Knowhow, Snipplets, TYPO3, Web Entwicklung | Kommentare (0)

Kundenfang bei greatnet.de

Samstag, 31. Januar 2009 13:07

Vor ein paar Wochen habe ich eine Nachricht von meinem ISP alfahosting.de bekommen, dass Browserspiele laut der AGB auf normalen Hosting-Paketen nicht erlaubt sind und sie deshalb mein Browserspiel www.madtv-online.com gesperrt haben. In der AGB konnte ich lesen, dass “Spiele-Server” nicht erlaubt sind, nur wird dies eben so ausgelegt, dass Browserspiele auch in diese Kategorie fallen.

In der Annahme, das nächstbessere Hosting wäre ein VServer, habe ich mir den “VServer Entry” bei greatnet.de geholt. Das war leider ein Fehler, denn seitdem ist die Webseite öfters nicht erreichbar: die 128 MB RAM sind einfach viel zu wenig.

Außerdem war der VServer von Seiten greatnet miserabel konfiguriert: Der MySQL Prozeß hat allein 100 MB von den verfügbaren 128 MB Speicher zugestanden bekommen! Zur Verarbeitung der anderen Prozesse (z.B. apache, sendmail, …) waren kaum noch Ressourcen frei…

Aller Wahrscheinlichkeit nach hole ich mir nun einen VServer bei keyweb.de. Dort bekomme ich für das gleiche Geld 512 MB. Ich hoffe, keyweb hat keine anderen Tricks, mir das Geld aus der Tasche zu ziehen.

Thema: Privat, Server-Administration, Ärgernisse | Kommentare (2)

Tipps und Hinweise zum Versand von Newslettern

Samstag, 31. Januar 2009 12:46

Wichtig

  • Rechtliche Hinweise beachten
  • Testen mit verschiedenen Browsern und E-Mail-Programmen
  • E-Mail-Adressen der Empfänger vor dem Versenden auf ihre Gültigkeit überprüfen
  • Den Header der E-Mail anschauen: Ist dort alles korrekt? Absender, Betreff, Antwort an, Gesendet von, …
  • An die Absende-Adresse des Newsletters gehen nicht nur die Rückläufer, vereinzelt antworten die Empfänger auch auf einen Newsletter. Deshalb sollten dieses E-Mail-Konto auch beobachtet werden.
  • Rückläufer: Viele Newsletter kommen zurück (ca. 10%; Gründe siehe entsprechenden Artikel), das sollte bei der Auswahl der Absender-E-Mail-Adresse berücksichtigt werden. Damit der Posteingang nicht schnell überquillt, sollte man einen Filter einrichten, der E-Mails mit dem Betreff “Returned mail: see transcript for details”, “Warning: could not send message for past 4 hours”, “Mail delivery failed: returning message to sender”, “Undelivered Mail Returned to Sender” oder “Delivery Status Notification (Failure)” oder mit dem Absender “Mail Delivery Subsystem”, “Mail Delivery System” oder “MAILER-DAEMON” umleitet.

Achtung

  • Verwendet man besondere Inhalte wie Bilder, Flash oder JavaScript (oder selbst nur HTML) in E-Mail-Newslettern, sollte man beachten, dass viele Empfänger den Newsletter aus folgenden Gründen nicht lesen können bzw. gar nicht erhalten:
    • Antivirus-Software
    • Firewalls
    • SPAM-Filter
    • Sicherheitseinstellungen
    • Hersteller und Version des verwendeten Email-Programms
  • Liegen Teile des Newsletters im www (z.B. Bilder), so werden diese natürlich nicht angezeigt, wenn der Newsletter offline betrachtet wird. Der Newsletter sollte auch ohne diese externen Bestandteile noch lesbar sein!
  • Bilder ohne ALT-Attribut einbinden: Wenn das Bild nicht geladen wird (und Bilder werden in E-Mail-Clients oft standardmäßig nicht geladen) wird der eigentliche E-Mail-Text durch alt-Tags unleserlich.
  • Flash im Newsletter: besser nicht, von den E-Mail-Programmen kann nur MacMail Flash anzeigen. Quelle: www.campaignmonitor.com
  • JavaScript im Newsletter: auf keinen Fall. Die webbasierten E-Mail-Klients blockieren es, die anderen unterstützen es zumeist gar nicht.
  • HTML als Tabelle aufbauen! Vor allem Outlook (die neueren Versionen!) machen hier Probleme. Aber: Keine colspan und rowspan verwenden. Siehe auch Artikel bei campaignmonitor.com

Spam-Filter vermeiden

Damit Newsletter nicht als Spam deklariert werden, muss man ein paar Dinge beachten:

  • Bei HTML-Mailings den HTML- und Body-Tag nicht vergessen!
  • Die Absender-E-Mail-Adresse muss existieren
  • Header der E-Mail genau anschauen, z.B. wenn das Feld “Gesendet von” existiert, sollte dieses die Domain oder die Absender-E-Mail-Adresse enthalten.
  • Nicht innerhalb kurzer Zeit tausende Newsletter verschicken: Häufige Massenversender werden evtl. als Spammer deklariert -> mehrere Server verwenden. Deshalb vorab die IP-Adresse des Mailservers herausbekommen und in danach in der Blacklist nachschauen, ob er gelistet ist.
  • Der Mailserver muss einen gültigen “Reverse DNS”-Eintrag besitzen
  • Den User mit seinem Namen anreden
  • Aktuelles Datum im Text
  • Betreff und Newsletter-Text ohne Werbeworte wie z.B. Angebot, gratis, kostenlos
  • Hinweise auf besonders Spam-verdächtige Branchen und Produkte (Erotik, Pharmazeutik) oder reine Produktpräsentationen (insbesondere in Verbindung mit Preisangaben) vermeiden
  • Response Management: Links, die das User-Verhalten dokumentieren, können kritisch sein
  • E-Mail im MIME-Multipartformat verschicken, d.h. der Newsletter wird gleichzeitig im Nur-Text- als auch im HTML-Format verschickt
  • Möglichst wenig HTML und Grafiken, keine Formulare und JavaScript
  • Normaler Gebrauch von Großbuchstaben, Satzzeichen, Leerzeichen und Sonderzeichen, also z.B. keine Großschreibung über mehrere Wörter
  • Auch hier gilt: Testen mit den verschiedenen Anbietern (AOL, Gmail, web.de, Microsoft Outlook, Thunderbird, …)! Diese haben verschiedene Filterkriterien. Kommt ein Newsletter nicht an oder landet im Spam-Ordner, muss man die Gründe suchen.

Ein Tool, um einen Newsletter auf Spam zu bewerten, ist SpamAssasine. Auch das Spam Rating Tool von emarsys.com nutzt diesen: Man kann den Newsletter an deren E-Mail-Adresse schicken, der dann automatisch auf verdächtige Kriterien gecheckt wird. Nach kurzer Zeit bekommt man dann eine E-Mail mit dem Resultat zurück, der Spam-Score darin sollte 5 nicht übersteigen.

Gründe für Rückläufer

  • E-Mail-Postfach des Empfängers voll
  • E-Mail-Adresse / Domain existiert nicht mehr
  • Host der E-Mail-Adresse war ungültig, z.B. email@tonline.de anstatt email@t-online.de
  • Wenn das Zielsystem (z.B. Server von t-online) nach wiederholten Zustellungsversuch nicht reagiert, kommt E-Mail nach 72 Stunden zurück
  • E-Mail zu groß für Mailsystem
  • Abgebrochene Mail-Schleife: E-Mail wird zu oft weitergeleitet / in einer Schleife weitergeleitet
  • Firewall des Zielsystems blockt E-Mail ab / E-Mail wird als Spam deklariert
  • Evtl.: AOL lehnt alle Mails ab, deren Absender von einem Mailserver stammt, dessen IP Adresse nicht per Reverse-Lookup aufgelöst werden kann. D.h. alle Mailserver mit dynamischer IP bleiben aussen vor.

Thema: Beruflich, Marketing | Kommentare (0)