Jede Webseite benötigt eine Möglichkeit, Mails zu versenden, meist nach einer Interaktion mit einem Besucher in einem Kontaktformular, in einem Gästebuch, bei einer Anmeldung oder bei einem Voting. Wie man das mit ASPX lösen kann, zeigte der Beitrag “Klassisches Mailformular“. ASPX benutzt die im DotNet-Framework enthaltenen Bibliotheken zur Kommunikation mit einem Mailserver.

Wenn nun aber eine Anwendung überwiegend in PHP programmiert ist, wirkt diese ASPX-Datei wie ein Fremdkörper und außerdem würde sie – im Gegensatz zum restlichen PHP-Kode – nur auf einem Windows-Server laufen. Was kann man daher für ein Web tun, das auf PHP aufbaut?

PHP ist mit einer Funktion mail() augestattet, die aber auf Windows-Servern nicht bedient wird. Außerdem ist diese Funktion nur eine sehr rudimentäre Version von dem, was wir heute als Mail kennen (man kann keine HTML-Emails und keine Anhänge versenden). Man verwendet daher statt mail() die am weitesten verbreitete Bibliothek für diesen Zweck, den “PHP-Mailer”.

Wir haben dieses Programmpaket mit zwei Testdateien in Betrieb genommen. Man kann es über den Link weiter hinten downloaden.

Installation

Man holt sich die Datei mail.zip, lädt sie mit dem Datei-Manager des WebsitePanel in das gewünschte Verzeichnis und entpackt es dort. Es entsteht ein Verzeichnis mail, das einerseits das unveränderte Verzeichnis PHPMailer-master enthält und zwei Testdateien, die demonstrieren, wie man den PHPMailer anwendet. Darüber hinaus gibt es im Verzeichnis examples viele weiter gehende Beispiele.

Sollte eine neue Version des Programms erscheinen, muss man lediglich diesen Ordner PHPMailer-master  löschen und durch die neue Version ersetzen. Die zwei Testdateien sind im Ordner mail enthalten. mail.php sendet eine Mail, die durch Übergabe von Parametern über POST vom Formular formular_simple_php.htm übernommen wurden.

mail (Ordner)
+ mail.php
+ formular_simple_php.htm
+ PHPMailer-master (Ordner)

Formular formular_simple_php.htm

Dieses Beispiel-Formular enthält einige Felder <input type="text"..., die in einem Tag form eingeschlossen sind (vorname, nachname, email und telefon). Klickt man auf den Submit-Button, sendet das Formular alle Eingaben an die Datei mail.php, die sich – weil ohne zusätzliche Pfadangabe – im selben Verzeichnis befinden muss. mail.php verarbeitet diese Eingaben und sendet eine Mail.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Anmeldeformular</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="Description" content="Anmeldeformular" />
</head>

<body>
  <h2>Anmeldeformular</h2>

  <form action="mail.php" method="post">
    <input type="hidden" name="subject" value="Worum geht es hier" />
    <input type="hidden" name="debug" value="0" />
    <input type="text" name="vorname" /><label>Vorname</label><br />
    <input type="text" name="nachname" /><label>Nachname</label><br />
    <input type="text" name="email" /><label>E-Mail Adresse</label><br />
    <input type="text" name="telefon" /><label>Telefonnummer</label><br />
    <input type="submit" value="Formular senden" />
  </form>
</body>
</html>

Wesentlich bei diesem Formular ist eigentlich nur das versteckte Feld subject, das angibt, welches (von mehreren möglichen) Formularen etwas schickt. Alle anderen Felder werden mit Namen und jeweiligem Wert vom Programm mail.php zusammengefasst und als Feld body der versendeten Mail abgeschickt. Mit dem versteckten Feld debug kann man das Debuggen aktivieren ohne die Datei mail.php verändern zu müssen.

mail.php

Dieser kurze PHP-Kode benötigt die Datei PHPMailerAutoload.php und findet diese im Ordner PHPMailer-master. Debuggen kann man aktivieren, indem man $DEBUG=1; einsetzt. Es werden dann verschiedene Variablen ausgegeben, die zu Fehlersuche verwendet werden können.

<?php
 require 'PHPMailer-master/PHPMailerAutoload.php';
 $DEBUG = isset($_POST["debug"]) ? $_POST["debug"] : "0"; 
 if ($DEBUG==1) {
   error_reporting(-1);
   ini_set('display_errors', 'On');
 }
 $Host     = "mail.ccc.at"; 
 $Username = "--E-Mail--";
 $Password = "--Passwort--";
 $From     = "--E-Mail des Absenders--";
 $FromName = '--Name des Absenders--';
 $To       = "--E-Mail des Empfängers--";

 $Subject = isset($_POST["subject"]) ? $_POST["subject"] : "Formulardaten"; 
 $Headers = isset($_POST["headers"]) ? $_POST["headers"] : ""; 
 $Body = ""; // alle Formularfelder 
 if ($DEBUG==1) echo "<pre>";
 foreach ($_POST as $param_name => $param_val) {
   if ($param_name=='subject') continue;
   if ($DEBUG==1) echo "$param_name:$param_val\n";
   $Body = $Body."$param_name:$param_val\n";
 }
 if ($DEBUG==1) echo "</pre>";
 
 // date_default_timezone_set('Etc/UTC');

 $mail = new PHPMailer;
 $mail->isSMTP();

 //Enable SMTP debugging
 // 0 = off (for production use)
 // 1 = client messages
 // 2 = client and server messages
 $mail->SMTPDebug = 0;
 $mail->Debugoutput = 'html';
 $mail->Host = $Host;
 $mail->Port = 25;
 $mail->SMTPAuth = true;
 $mail->Username = $Username;
 $mail->Password = $Password;
 $mail->setFrom($From);
 $mail->FromName = $FromName;
 $mail->addAddress($To);
 $mail->Subject = $Subject;
 // $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
 $mail->Body = $Body;
 // $mail->AltBody = '';
 // $mail->addAttachment('images/phpmailer_mini.png');

 // before sending something to client:
 $Headers_parts = explode("\r\n",$Headers);
 if ($DEBUG==1) {
   echo "<pre>";
   echo "\r\nHeaders:\r\n";
   print_r($Headers_parts);
 }
 foreach($Headers_parts as $Header) {
   header($Header."\r\n");
 }
 $Error = $mail->send();
 if ($DEBUG==1) {
   echo "\r\nMail:\r\n";
   print_r($mail);
   if ($Error==1) echo "Erfolg!"; else echo "Fehler:".$Error;
   echo "</pre>";
 } 
?>

Konfiguration mail.php

Bevor man Mails über Formulare versenden kann, muss man die Datei mail.php konfigurieren. Einzusetzen sind die Werte für $Host, $Username, $Password, $From, $FromName:

 $Host     = "mail.ccc.at"; 
 $Username = "--E-Mail--";
 $Password = "--Passwort--";
 $From     = "--E-Mail des Absenders--";
 $FromName = '--Name des Absenders--';
 $To       = "--E-Mail des Empfängers--";

Für eine Mailbox am Mailenable-Server von ClubComputer ist $Host="mail.ccc.at"; $Username ist die vollständige Adresse der verwendeten Mailbox, also name@domain.at und $Password das zugehörige Passwort. $From ist identisch mit $Username und $FromName="Dein Name". Das Feld $To kann dieselbe Adresse enthalten wie $From, wenn man dieselbe Mailbox auch zum Lesen der Mails benutzt.

Links

Franz Fiala

Präsident Clubcomputer / Herausgeber PCNEWS bei ClubComputer.at
Franz ist pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreut unser Clubtelefon und Internet Support. Er ist leidenschaftlicher Rapid Wien Fan.

Letzte Artikel von Franz Fiala (Alle anzeigen)