HTML-Mails mit PHP Versenden

Gepostet am 22 December 2013 in: e-mail php

In einem früheren Post wurde ja bereits erklärt wie am besten Mails mit PHP verschickt werden. Dabei wurden aber nur Plaintext E-Mail versendet. Wie das ganze mit HTML E-Mail funktioniert wird in diesem Beitrag beschrieben.

Bei HTML-Nachrichten ist es Wichtig, das gültiges und Vollständiges HTML verwendet wird. Am besten wird auch eine “Nur-Text” Alternative angeboten.

Als Grundalge dient der Code aus dem Post Mails mit PHP Versenden. Wichtig ist hierbei die Angabe der Zusätzlichen Header MIME-Version und Content-Type. Bei letzterem muss man gegebenenfalls das Charset anpassen, je nachdem welches man verwendet.

Nur HTML

Bei der Version, die nur HTML enthält, hat man zwar weniger Arbeit, aber dafür erreicht man den Spam-Level von 0 nicht. Bei der folgenden Version erhält man jedoch einen möglichst geringen Wert:

<?php
$headers = 'From: mail@example.com' . "\r\n" .
    'Date: ' . date("r") . "\r\n" .
    'Message-Id: <' . str_replace(".","_",uniqid('', true)) . '@' . getenv("SERVER_NAME") . '>' . "\r\n" .
    'MIME-Version: 1.0' . "\r\n" .
    'Content-type: text/html; charset=iso-8859-1';
$text = <<<EOS
<html>
        <head>
                <title>Betreff</title>
        </head>
        <body>
                <p>Nachrichtentext formatiert mit <i>HTML</i></p>
        </body>
</html>
EOS;
mail("recipient@example.com","Betreff",$text, $headers);
?>

Mit Plaintext Alternative

Unter Angabe einer “Nur-Text” Alternative kann man sogar einen Spam-Score von 0 erreichen. Dazu muss man aber einen extra Text definieren, hier im Beispiel Nachrichtentext formatiert mit /HTML/. Das boundary ist wichtig, damit der Client weiß, wo welche Version zu finden ist.

Dabei ist der Nachrichtentext wie folgt aufgebaut:

--Boundary
Header

Inhalt (im Beispiel Plaintext)

--Boundary
Header

Inhalt (im Beispiel HTML)

--Boundary--

Das fertige Script sieht dann so aus:

<?php
$boundary = "boundary-" . md5(time());
$headers = 'From: mail@example.com' . "\r\n" .
    'Date: ' . date("r") . "\r\n" .
    'Message-Id: <' . str_replace(".","_",uniqid('', true)) . '@' . getenv("SERVER_NAME") . '>' . "\r\n" .
    'MIME-Version: 1.0' . "\r\n" .
    'Content-Type: multipart/alternative; boundary="' . $boundary . '"' ;
$text = <<<EOS
--$boundary
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Nachrichtentext formatiert mit /HTML/

--$boundary
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<html>
        <head>
                <title>Betreff</title>
        </head>
        <body>
                <p>Nachrichtentext formatiert mit <i>HTML</i></p>
        </body>
</html>

--$boundary--
EOS;
mail("recipient@example.com","Betreff",$text, $headers);