PHP/E-Mail versenden

Aus Mikiwiki
< PHP
Zur Navigation springen Zur Suche springen

Die Funktion "mail"

Mit der Funktion "mail" können E-Mails versandt werden. Voraussetzung ist ein lokal installierter SMTP-Server. Die Funktion gibt "FALSE" zurück, wenn der Aufruf misslang. Der erste Parameter bestimmt die Zieladresse, der zweite den Inhalt der Betreffzeile und der dritte die eigentliche Nachricht. Optional können mit dem vierten Parameter weitere Kopfzeilen (Header) hinzugefügt werden.

mail($to, $subject, $message, $header);

Zum Einstellen des Absenders kann durch Erzeugen der Variable "$header" wie folgt vorgegangen werden. Dabei darf das Zeilenendezeichen "\n" nicht vergessen werden.

$header = "From: \"Vorname Nachname\" <vorname.nachname@domain.xx>\n";

Auf diese Weise können auch mehrere Header kombiniert werden.

$header  = "From: \"Vorname Nachname\" <vorname.nachname@domain.xx>\n";
$header .= "X-Mailer: PHP-Version " . PHP_VERSION . "\n";

Die eigentliche Nachricht wird so erstellt, wie der Empfänger es erwartet. Zeilenumbrüche bei reinen Textnachrichten werden mit "\n" erzeugt. Bei Versand von HTML eigenet sich die Nutzung des Puffers (siehe Ausgabesteuerung).

E-Mail mit Dateianhang versenden

Das folgende Beispiel zeigt, wie mit der Funktion "mail" auch komplexere Aufgaben erledigt werden können. Die Funktion liest eine Datei und versendet sie als Anhang.

<?php
function attach($to, $from, $subject, $message, $file) 
{
  ## Da der Header "Content-Transfer-Encoding" (weiter unten) die Kodierung
  ## nach Base64 vorschreibt, werden die Daten entsprechend behandelt.
  ## - "file_get_contents" liest die Datei in eine Zeichenkette.
  ## - "base64_encode" kodiert diese dannn nach Base64.
  ## - "chunk_split" sorgt dafür, dass die Datei in E-Mail-gerechte Teile
  ##   von 76 Zeichen pro Zeile zerlegt wird.
  $data          = chunk_split(base64_encode(file_get_contents($file)));
  ## Empfänger
  $header        = "To: "   . $to   . "\r\n";
  ## Absender
  $header       .= "From: " . $from . "\r\n";
  ## Die Kodierungsgrenzen, an denen der Anhang vom Nachrichtentext getrennt
  ## ist, werden durch eine MD5-kodierte Zufallszahl gebildet.
  $mime_boundary = "<<<:" . md5(uniqid(mt_rand(), 1));
  ## Dem Mail-Programm wird mit Hilfe der Kopfzeilen mitgeteilt, dass es 
  ## sich um eine nach MIME kodierte Nachricht handelt.
  $header       .= "MIME-Version: 1.0\r\n";
  $header       .= "Content-Type: multipart/mixed;\r\n";
  $header       .= " boundary=\"" . $mime_boundary . "\"\r\n";

  ## Der eigentliche Inhalt ist in mehrere Abschnitte zerlegt, die jeweils 
  ## von eigenen Kopfzeilen eingeleitet und von den Kodierungsgrenzen 
  ## umschlossen werden.
  $content  = "This is a multi-part message in MIME format.\r\n\r\n";
  ## Der Inhalt der E-Mail wird als normaler Text übertragen, den die
  ## folgenden drei Zeilen einleiten.
  $content .= "--" . $mime_boundary . "\r\n";
  $content .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
  $content .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
  ## Hier folgt nun der Text.
  $content .= $message . "\r\n";
  ## Der Dateianhang wird durch vier weitere Kopfzeilen eingeleitet.
  $content .= "--" . $mime_boundary . "\r\n";
  $content .= "Content-Disposition: attachment;\r\n";
  $content .= "Content-Type: Application/Octet-Stream; name=\"" . $file . "\"\r\n";
  $content .= "Content-Transfer-Encoding: base64\r\n\r\n";
  ## Der Dateianhang
  $content .= $data . "\r\n";
  $content .= "--" . $mime_boundary . "\r\n";
  if(@mail($to, $subject, $content, $header)) 
  {        
    return TRUE;
  }    
  echo "Fehler: " . $php_errormsg;
  return FALSE;
}
$to      = "muster@mdomain.xx";
$from    = "absender@domain.xx";
$subject = "Test mit PDF";
$message = "Diese Mail enthält einen wichtigen Anhang!";
$file    = "data/test.pdf";
ini_set("track_errors", "On");
attach($to, $from, $subject, $message, $file);
?>

Alternativ zu Base64 kann ein dateianhang auch mit UUENCODE kodiert werden. Der Aufbau des Körpers der E-Mail folgt dann der folgenden Struktur. Um den Block zwischen den umschliessenden Markierungen zu kodieren, kann die Funktion "convert_uuencode" eingesetzt werden.

begin 666 filename.ext\r\n
Hier folgt der kodierte Inhalt
end\r\n