info@a-coding-project.de

E-Mails versenden mit PHP

Die Skriptsprache PHP stellt ein umfangreiches Werkzeug zum Versand von Emails über das Internet dar. In der Konfigurationsdatei php.ini muss dazu "nur" das Email-Programm (Unix) bzw. der Mailserver (Windows) eingetragen werden. Danach kann man als Programmierer schon mit dem Skriptschreiben loslegen. Im folgenden Artikel werden die verschiedenen Möglichkeiten, die beim Email-Versand vorhanden sind, aufgezeigt.

Konfiguration der php.ini

In der php.ini-Datei sieht der Abschnitt für die Email-Konfiguration in etwa so aus:

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = postmaster@localhost

; For Unix only.  You may supply arguments as well (default:
; "sendmail -t -i").
;sendmail_path =

Wenn als Betriebssystem Windows verwendet wird, sind die Zeilen mit dem Zusatz "For Win32 only" relevant. Für Unix gilt nur die Zeile mit der Ergänzung "For Unix only".

Im Windows-Bereich muss in der Zeile "SMTP" der Email-Server eingetragen werden. Wenn sich der Mail-Server, auf denPHPzugreifen soll, auf dem Programmier-PC befindet, kann der Eintrag "localhost" belassen werden. Ansonsten muss der Email-Server des entsprechenden Internet-Providers eingetragen werden. Die notwendigen Informationen dazu findet man auf der Webseite des jeweiligen Providers.
In der Zeile "sendmail_from" gibt man eine Email-Adresse für den Absender an. Für den eigentlichen Email-Versand ist das notwendig. Diese Mailadresse muss in der Wirklichkeit nicht existieren, aber gültig sein (d.h. mit "@"). Wenn keine explizite Adresse definiert, wird der Standardeintrag für diesen Parameter automatisch übernommen.

Hinweis: Nach der Konfigurationsänderung muss der Webserver neu gestartet werden.

Einfacher Email-Versand

Am einfachsten ist es, wenn eine normale Textemail an einen bestimmten Empfänger geschickt wird.
Generell werden in PHP alle Emails mit der mail-Funktion verschickt.
Das folgende Beispielskript zeigt den einfachen Email-Versand an einem bestimmten Empfänger. Als Absende-Adresse wird dazu der Standard aus der php.ini übernommen.

<?php
$adresse = "info@a-coding-project.de";
$betreff = "E-Mail an a coding project";
$inhalt = "Das Skript schickt eine E-Mail";
@mail($adresse,$betreff,$inhalt);
?>

Die Variablen $adresse, $betreff und $inhalt definieren den Empfänger, den Betreff sowie den eigentlichen Inhalt der Email. Mit der mail-Funktion wird die Email dann mit den vorher definierten Parametern verschickt. Das @-Zeichen vor der mail-Funktion unterdrückt eventuelle Fehlermeldungen von PHP, wenn mit dem Email-Versand etwas nicht geklappt hat.

Eigene Absender-Adresse

Als Absende-Adresse wird beim obigen Beispiel nun der Standardeintrag aus der php.ini angezeigt, der im Zeifelsfall - besonders bei großen Webhostern - nicht dem gewünschten Namen entspricht. Hierfür gibt es die einfache Möglichkeit, eine selbst definierte Email-Adresse für den Absender anzugeben. Das bestehende Skript muss dazu nur wenig verändert werden:

<?php
$adresse = "info@a-coding-project.de";
$betreff = "E-Mail an a coding project";
$inhalt = "Das Skript schickt eine E-Mail";
$header = "From: meinname@meinedomain.dern";
@mail($adresse,$betreff,$inhalt,$header);
?>

Zu den normalen Parametern kommt nun ein Parameter $header hinzu. Dieser enthält die sogenannten Headerdaten (Kopfdaten der E-Mail) zu denen auch der Absender zählt. Hier notiert man einfach "From:" gefolgt von den Absenderinformationen und übergibt es der mail-Funktion.

Eine HTML-E-Mail versenden

Bis jetzt wurde im Skript nur eine einfache Texte als Inhalt definiert. Natürlich lassen sich aber auch HTML-Emails verschicken. Auch hierzu sind wiederum nur wenige Änderungen an dem obigen Mail-Skript durchgeführt werden:

<?php
$adresse = "info@a-coding-project.de";
$betreff = "E-Mail an a coding project";
$inhalt = " <p>Ich <b>bin</b> <u>eine</u> <i>HTML-Mail</i>.</p> ";
$header = "Content-Type:text/htmlrn";
$header .= "From: meinname@meinedomain.dern";
@mail($adresse,$betreff,$inhalt,$header);
?>

Der Inhalt der Email wird - wie bereits bekannt - der Variable $inhalt zugewiesen. Der Inhalt der Variablen besteht nun einfach aus normalen HTML-Code. Damit ein E-Mail-Programm den Inhalt nun auch als HTML-Mail identifiziert wird eine weitere Header-Zeile eingefügt die den Typ des Inhalts beschreibt (Content-Type).

E-Mails mit Anhang senden

Nur einfache Mails zu senden ist in einigen Fällen nicht genug - ein Anhang soll mitgeschickt werden. Hierzu sind etwas weitreichendere Änderungen am bestehenden Skript nötig. Schauen wir uns dazu zunächst das fertige Skript an:

<?php
  $Empfaenger = "info@a-coding-project.de";
  $Betreff = "Mail mit Anhang";
  $DateinameMail = "text.pdf";
  $h = fopen("./test.gif", 'rb');
  $filecontents = fread($h, filesize("./test.gif"));

  $Trenner = md5(uniqid(time()));

  $Header = "From: meinname@meinedomain.den";
  $Header .= "MIME-Version: 1.0n";
  $Header .= "Content-Type: multipart/mixed; boundary=$Trennern";

  $text = "This is a multi-part message in MIME formatn";
  $text .= "--$Trennern";
  $text .= "Content-Type: text/plainn";
  $text .= "Content-Transfer-Encoding: 8bitnn";
  $text .= $text."n";
  $text .= "--$Trennern";
  $text .= "Content-Type: image/gif; name=$DateinameMailn";
  $text .= "Content-Transfer-Encoding: base64n";
  $text .= "Content-Disposition: attachment; ".
           "filename=$DateinameMailnn";
  $text .= chunk_split(base64_encode($filecontents));
  $text .= "n";
  $text .= "--$Trenner--";

  mail($Empfaenger, $Betreff, $text, $Header);
?>

Das Verfahren ist recht einfach: Soll ein Anhang verschickt werden, wird die Mail als Multipart-Mail definiert - d.h. sie besitzt mehrere Teile (eben multi-part). Dazu wird den Header-Daten zwei Zeilen übergeben die dies definieren: einmal die Mime-Version und einmal der Content-Type mit dem entsprechenden Wert multipart/mixed. Außerdem wird beim Content-Typ auch der Trenner beschrieben (boundary=...) - eine einfache Zeichenfolge die zwischen den einzelnen Bestandteilen der Mail für Trennung sorgt.

Der Inhalt der Mail ($text) wird dann entsprechend erweitert. Zum normalen Inhalt werden, begetrennt durch unseren Trenner, die neuen Bestandteile angefügt: Zunächst der Text ($text) und anschließend der Dateiinhalt ($filecontens) in Base64-Codierung. Letzteres ist notwendig um die Mail auch mit Anhang korrekt versenden zu können.

Alles zusammen wird wieder an die mail-Funktion übergeben und entsprechend verschickt.

Weiterlesen: ⯈ Konfiguration der php.ini

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant