Category: Webentwicklung

Zeichensatz festlegen bei generierten E-Mails

Programmierer habens oft eilig. Und sie gehen den Weg des geringsten Widerstands, was einfach geht, wird auch einfach gemacht. Bekanntes Beispiel: das Versenden von E-Mails aus der Applikation heraus, z.B. für Bestätigungsmails, Formularmailer usw.; in nahezu jeder Sprache gibt es dafür einfache Klassen oder Befehle, die eine E-Mail erzeugen und versenden.

Leider wird dabei häufig vergessen, den Zeichensatz der generierten Mail richtig (bzw. überhaupt) zu setzen. Hat eine Mail im Header kein Feld “Content-Type:” gesetzt, so handelt man sich zwei gravierende Probleme ein:

  1. Der empfangende Client kann die Mail nicht richtig interpretieren, da er nicht weiß, in welcher Codierung der Inhalt der Mail ist. Das hat zur Folge, dass Umlaute, Sonderzeichen usw. nicht richtig angezeigt werden.
  2. viele Spam-Filter werten dies als Negativ-Punkt, somit steigt die Wahrscheinlichkeit, dass die Mail ihren Empfänger nicht erreicht.

Ich schreibe hier mal beispielhaft für PHP, Java, Spring und SEAM, wie man den Header um die Content-Type Angabe ergänzen kann. Dabei beschränke ich mich der Einfachheit halber auf eine simple Textmail, also kein Multipart mit HTML oder Attachment (Beispiele dazu lassen sich schnell im Web finden).

PHP:

$header = 'MIME-Version: 1.0' . "\n" . 'Content-type: text/plain; charset=UTF-8' . "\n" . $strFrom;
mail($strEmpfaenger, $strSubject, $strMailtext, $header) or die("Die Mail konnte nicht versendet werden.");

Java:

MimeMessage message = new MimeMessage(session);
message.setHeader("Content-Type", "text/plain" + "; charset=" + "UTF-8");

Spring:

MimeMessage mimeMessage = ...
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8");

SEAM: (ein Facelet-Template, das vom SEAM gerendert wird)

   ...

Die Beispiele sind bewusst kurz gehalten, das Thema E-Mail-Programmierung kann wohl Bücher füllen. In erster Linie will ich Entwickler motivieren, bei aller Eile auch an die Kleinigkeiten zu denken.

jsolutions.de runderneuert

An dieser Stelle mal ein bisschen offtopic Werbung in eigener Sache: Meine Firmenwebseite http://www.jsolutions.de/ ist in komplett überarbeiteter Form neu online gegangen. In den letzten Jahren war leider nicht viel Zeit, sich um die eigene Präsenz im Web konsequent zu kümmern und es war mehr als überfällig, die Darstellung der Firma an deren Entwicklung anzupassen.

Ich hoffe das neue Design ist gelungen – Kritik kann ja gerne hier in den Kommentaren hinterlassen werden!

Wer über Neues und Interessantes von und mit jsolutions im Bilde bleiben möchte kann via Twitter folgen: http://twitter.com/jsolutions_de

Apache: Zugriffsbeschränkung via htaccess

Gerade eben musste ich es mal wieder einrichten: Zugriffskontrolle auf ein Verzeichnis im Apache. Dazu hatte ich vor Jahren auf einer meiner Uralt-Webseiten schon mal einen Artikel geschrieben. Den re-publiziere ich hier in (praktisch) unüberarbeiteter Form:

Der htaccess-Mechanismus erlaubt eine verzeichnisorientierte Zugriffsbeschränkung über eine Authentifizierung. htaccess verlangt normalerweise einen gütigen Benutzername und Passwort, um auf dieses Verzeichnis (und seine Unterverzeichnisse) zugreifen zu dürfen.
Folgende Dinge sind zu tun, um ein Verzeichnis zu schützen:

1. in der httpd.conf:
htaccess muss für das Verzeichnis erlaubt werden. Dazu ist die Direktive AllowOveride All zu setzen. Beispiel:

<Directory /pfad/apache/htdocs/diesesverzeichnis>
    AllowOveride All
</Directory>

2. Anlegen der Datei .htaccess:
Im zu schützenden Verzeichnis wird die Datei angelegt (führenden Punkt nicht vergessen, dies ist eine versteckte Datei!):

AuthName "Dies ist der Login-Bereich von Fritzchen"
AuthType Basic
AuthUserFile /pfad/public/htdocs/login/.htpasswd
require valid-user

3. Anlegen der Datei .htpasswd:
Das Anlegen dieser Datei geschieht mit dem htpasswd-Befehl [update]bei Apache2 mit dem korrelierenden Befehl htpasswd2[/update]. Da die Passwörter verschlüsselt gespeichert werden, kann die Datei nicht von Hand erstellt werden.

Wir erzeugen die Datei z.B. mit folgendem Befehl:

$ htpasswd -c .htpasswd ersterbenutzer

Für jeden weiteren Benutzer rufen wir den Befehl ohne “create” auf:

$ htpasswd .htpasswd weitererbenutzer

IE6 No More! Kampagne

Genug ist genug! Über 8 Jahre alt ist der Internet Explorer Version 6 nun und muss leider immer noch in quasi allen Webprojekten berücksichtigt werden. Jeder Webentwickler weiß, welcher Aufwand dahinter steckt und wie sehr man sich mit dem Einsatz heutiger Technologien zurückhalten muss, nur damit alles auch bei dem alten Herrn noch hübsch aussieht.

Dagegen wurde nun von verschiedenen Unternehmen eine kleine Kampagne ins Leben gerufen, welche zum Ziel hat, den Anteil der IE6-Nutzer zu senken. Dazu stellen sie Webentwicklern einen kleinen Code-Schnipsel zur Verfügung, der bei Verwendung von IE6 oder älter einen Hinweis ausgibt.

ie6nomore

Insgesamt finde ich die Idee sehr gut und habe daher auch die deutsche Version des Codes beigesteuert (aktuell noch nicht auf deren Webseite veröffentlicht). Freilich soll das keinesfalls die Lösung aller Probleme sein, es wird nach wie vor in kommenden Projekten eine Berücksichtigung des Dinosauriers geben (müssen), aber in kleineren Auftritten oder auf privaten Webseiten kann man so einen Hinweis sicher mal guten Gewissens anbringen.

Hier noch die ins Deutsche übersetzte Variante:

<!--[if lt IE 7]>
<div style='border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; height: 75px; position: relative;'>
  <div style='position: absolute; right: 3px; top: 3px; font-family: courier new; font-weight: bold;'><a href='#' onclick='javascript:this.parentNode.parentNode.style.display="none"; return false;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-cornerx.jpg' style='border: none;' alt='Diesen Hinweis schliessen'/></a></div>
  <div style='width: 640px; margin: 0 auto; text-align: left; padding: 0; overflow: hidden; color: black;'>
    <div style='width: 75px; float: left;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-warning.jpg' alt='Warnung!'/></div>
    <div style='width: 275px; float: left; font-family: Arial, sans-serif;'>
      <div style='font-size: 14px; font-weight: bold; margin-top: 12px;'>Sie verwenden einen veralteten Browser</div>
      <div style='font-size: 12px; margin-top: 6px; line-height: 12px;'>Um diese Seite optimal darzustellen, verwenden Sie bitte einen modernen Webbrowser.</div>
    </div>
    <div style='width: 75px; float: left;'><a href='http://www.firefox.com' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-firefox.jpg' style='border: none;' alt='Lade Firefox 3.5 herunter'/></a></div>
    <div style='width: 75px; float: left;'><a href='http://www.browserforthebetter.com/download.html' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-ie8.jpg' style='border: none;' alt='Lade Internet Explorer 8 herunter'/></a></div>
    <div style='width: 73px; float: left;'><a href='http://www.apple.com/safari/download/' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-safari.jpg' style='border: none;' alt='Lade Safari 4 herunter'/></a></div>
    <div style='float: left;'><a href='http://www.google.com/chrome' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-chrome.jpg' style='border: none;' alt='Lade Google Chrome herunter'/></a></div>
  </div>
</div>
<![endif]-->