E-Mails mit PHP zu ver­sen­den geht ja ansich ganz ein­fach und kom­for­ta­bel. In­ter­es­sant wird es je­doch, wenn Text­mails mit ma­nu­el­len Zei­len­um­brü­chen ver­schickt wer­den sollen.

Ein Zei­len­um­bruch wird im Mail­text bei­spiels­weise wie folgt erzeugt:

$mailtext = "Ich bin ein Absatz.\n";
$mailtext.= "Und ich auch!";

Da­mit die Steu­er­zei­chen \n, \r oder \t in­ter­pre­tiert wer­den müs­sen sie in dop­pel­ten An­füh­rungs­zei­chen ste­hen! Ein­fa­che An­füh­rungs­zei­chen im obi­gen Bei­spiel wür­den be­wir­ken, dass das ab­schlie­ßende \n im E-Mail-Text aus­ge­ge­ben wird.

Soll nun Text aus ei­ner MySQL-Datenbank in die E-Mail flie­ßen, und wurde die­ser Text zu­vor über ein HTML-<textarea>–Feld in der Daten­bank ge­spei­chert, wer­den plötz­lich alle Daten­bank­in­halte mit dop­pel­ten Zei­len­um­brü­chen in der E-Mail dargestellt.

Grund da­für ist die Form des Zei­len­um­bruchs der beim Spei­chern in die Daten­bank ge­schrie­ben wird. Und das ist bei der Überg­abe des HTML-<textarea>–Fel­des ein so­ge­nann­ter „Windows-Zeilenumbruch“ im For­mat \r\n. Nor­ma­ler­weise in­ter­pre­tie­ren die meis­ten Pro­gramme diese Umbruchs-Kombination (Carriage-Return + New­Line) als ei­nen zu­sam­men­hän­gen­den Um­bruch, die gän­gi­gen E-Mail-Clients hin­ge­gen in­ter­pre­tie­ren \r\n als dop­pel­ten Zei­len­um­bruch. Auch un­ter Windows.

Um diese Miss­in­ter­pre­ta­tion zu um­ge­hen sollte vor Ver­sand der E-Mail der kom­plette E-Mail-Text nach die­ser Zei­chen­kom­bi­na­tion durch­sucht wer­den. Am ein­fachs­ten geht dies mit ei­nem Re­gu­lä­ren Aus­druck der alle Vor­kom­nisse von \r\n durch \n ersetzt.

$mailtext = "Ich bin ein Absatz.\n";
$mailtext.= "Und ich auch! Nach mir kommt Datenbankinhalt.";
$mailtext.= $datenbankinhalt;
 
$mailtext = preg_replace("%\r\n%", "\n", $mailtext);