Anzeige
Tutorialbeschreibung

PHP - Teil 28 - PEAR: E-Mails verschicken

PHP - Teil 28 - PEAR: E-Mails verschicken

In modernen Web-Applikationen müssen häufig E-Mails automatisch verschickt werden. Das Aufgabenspektrum reicht dabei vom Versand einfacher Formularinhalte bis hin zu E-Mails mit Dateianhängen. Für diese Aufgaben gibt es verschiedene PEAR-Pakete, von denen in diesem Video-Training Mail und Mail_Mime vorgestellt werden.

Icon-Ersteller: Oxygen-Team

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


PHP bringt von Hause aus bereits mit mail() eine Funktion zum Verschicken von E-Mails mit. Die Einstellungen zum Versenden von E-Mails müssen in der php.ini vorgenommen werden. Über sendmail_path muss der Sendmail-Pfad angegeben werden. Bei der Installation probiert PHP zwar, Sendmail zu finden und den Pfad in der php.ini zu setzen, dieser Versuch gelingt jedoch nicht immer. In diesem Fall muss man den sendmail_path nachträglich eintragen.

sendmail_path = /usr/sbin/sendmail –t –i

Neben Sendmail müssen auch dessen Optionen angegeben werden. Durch –t nimmt sendmail die Header der Standardeingabe entgegen. Über die Option i- wird festgelegt, dass ein einzelner Punkt nicht das Ende der Eingabe bedeutet. Auf Windows-Systemen gibt es standardmäßig kein Sendmail. Hier muss die php.ini folgendermaßen angepasst werden:
SMTP = smtp.psd-tutorials.de
sendmail_from = webmaster@psd-tutorials.de

Wie ihr seht, bedeutet die Vorbereitung für die Verwendung der mail()-Funktion einen erheblichen Mehraufwand. Zudem ist deren Funktionalität stark begrenzt. Zum Versenden von E-Mails ist das PEAR-Paket Mail besser geeignet. Dieses Paket unterstützt SMTP, Sendmail und die PHP-Funktion mail() als Backend. Ausführliche Informationen zur Konfiguration von PHP für den E-Mail-Versand liefert die Seite http://php.net/manual/de/mail.configuration.php.

Bilder



 

Das PEAR-Mail-Paket

Das Mail-Paket hat gegenüber der normalen PHP-mail()-Funktion zunächst einmal den Vorteil, dass sich hierüber E-Mails auf verschiedenen Wegen verschicken lassen. Das Paket greift entweder auf die mail()-Funktion zurück, benutzt ein vorhandenes Sendmail oder verschickt die E-Mails mittels SMTP über einen externen Server.

Die offizielle Seite zum Mail-Paket findet ihr unter http://pear.php.net/package/Mail/.

Bilder



 
Um eine Instanz der Klasse zu erhalten, ist eine Factory-Methode definiert. (Kurz zum Hintergrund dieser Methoden: Ein Factory ist ein Hilfsmittel zur Generierung von Objekten. Verwendet wird Factory, wenn die zur Generierung des Objekts verwendete Klasse erst zur Laufzeit bekannt ist). Die Factory-Methode wird statisch aufgerufen. Bei diesem Aufruf wird ihr die zu verwendende Versandmethode oder alternativ dazu der betreffende MTA (Mail Transport Agent) übergeben. Über den zweiten Parameter kann ein Array mit Optionen definiert werden. Welche Optionen man dabei angibt, hängt letztendlich vom verwendeten Mailer ab.

Beim ersten Parameter kann zunächst einmal mail angegeben werden. Dadurch wird im Hintergrund die mail()-Funktion eingesetzt. In diesem Fall kann es sich beim zweiten Parameter um eine Zeichenkette oder um ein Array handeln. Läuft auf dem Server nicht der Safe-Mode, werden diese Informationen als fünfter Parameter an die mail()-Funktion übergeben. Wurden die Daten als Array definiert, werden die Werte durch Leerzeichen getrennt und in einer Zeichenkette zusammengefasst. Ausführliche Informationen zur Funktionsweise dieses Parameters gibt es unter http://www.php.net/manual/de/function.mail.php.

Bilder



 
Ein typischer factory()-Aufruft sieht folgendermaßen aus:
require_once('Mail.php'); 
$mailer= Mail::factory('mail','-f webmaster@psd-tutorials.de');

In diesem Beispiel wird mail() genutzt. Soll stattdessen Sendmail verwendet werden, muss als erster Parameter die Zeichenkette sendmail übergeben werden. Als zweiter Parameter wird in diesem Fall ein assoziatives Array erwartet. Dabei wird über den Schlüssel sendmail_path der Pfad zu Sendmail definiert. Es können zusätzliche Kommandozeilenoptionen angegeben werden. Dafür wird der Schlüssel sendmail_arg verwendet.

Die am häufigsten genutzte Variante ist aber sicherlich der Einsatz eines SMTP-Servers. Dabei wird als erster Parameter die Zeichenkette smtp übergeben. Als zweiten Parameter notiert man ein assoziatives Array, in dem die für den STMP-Server relevanten Informationen stehen. Dazu gehört der Schlüssel host. Diesem Schlüssel weist man die IP-Adresse oder den Servernamen zu. Wurde kein Wert angegeben, wird automatisch localhost angenommen. Ist eine Authentifizierung am Server nötig, wird dem Schlüssel auth die Angabe true zugewiesen.

Anschließend gibt man über username und password die Kombination aus Benutzernamen und Passwort an, über die die Authentifizierung am SMTP-Server erfolgt.

Die Verbindung wird standardmäßig über den Port 25 hergestellt. Um einen anderen Port anzugeben, lässt sich dieser über den Schlüssel port bestimmen. Eine vollständige Definition könnte also folgendermaßen aussehen:
$options = array ( 
 'host'      => 'smtp.psd-tutorials.de', 
 'auth'      => true, 
 'username'  => 'user', 
 'password'  => 'geheim' 
);

Für den eigentlichen E-Mail-Versand wird send() verwendet. Diesem send() werden als erster Parameter die Empfängerdaten übergeben. Das geschieht üblicherweise in Form eines Arrays. Alternativ dazu könnte man die Daten auch als normale Zeichenkette angeben. Dabei müssen die einzelnen Werte dann durch Kommata getrennt werden. Letztendlich hängt das natürlich auch von der Anzahl der Empfänger ab. Sind es zwei bis drei, genügt die Zeichenketten-Variante.

Als zweiter Parameter wird ein assoziatives Array erwartet. Dabei gibt man die Header an, die für den E-Mail-Versand genutzt werden sollen. Hier ein Beispiel, wie ein solches Array typischerweise aussieht:
$headers=array( 
 'From' => 'webmster@psd-tutorials.de', 
 'Subject' => 'Deine Registrierung' 
); 
$sender=$mailer->send($empfaenger,$headers,'Deine Registrierung war erfolgreich'); 

Normalerweise sollten immer die beiden Header From und Subject angegeben werden. From weist man dabei die Absender-E-Mail-Adresse zu. Beim Subject handelt es sich um die Betreffzeile der E-Mail.

Als letzten Parameter weist man send() den E-Mail-Inhalt zu.

Konnte die E-Mail erfolgreich verschickt werden, liefert die Methode true zurück. Hat der Versand nicht funktioniert, handelt es sich beim Rückgabewert um ein PEAR_Error-Objekt.

Eine vollständige Anwendung des PEAR-Pakets Mail könnte folgendermaßen aussehen:
require_once('Mail.php'); 

$options = array ( 
 'host'      => 'smtp.psd-tutorials.de', 
 'auth'      => true, 
 'username'  => 'user', 
 'password'  => '123456' 
);
$mailer = Mail::factory('smtp',$options); 
if (true === PEAR::isError($mailer)) { 
   die ($mailer->getMessage());
} 
$empfaenger = 'fk@elmstreet.com';
$headers=array( 
 'From' => 'webmaster@psd-tutorials.de',
 'To' => 'kontakt@medienwerke.de', 
 'Subject' => 'Deine Registrierung' 
);
$sender=$mailer->send($empfaenger,$headers,'Deine Registrierung war erfolgreich'); 
if (true === PEAR::isError($sender)) {
   die ($sender->getMessage()); 
}

Zunächst wird das eigentliche Paket eingebunden. Innerhalb des Skripts werden dann die bereits vorgestellten assoziativen Arrays definiert. Verschickt wird anschließend eine einfache Test-E-Mail. Sollte es beim Versand zu einem Fehler kommen, wird die entsprechende Fehlermeldung ausgegeben.


 

E-Mails mit Anhängen verschicken

Das Versenden von Text-Mails muss nicht zwingend über das PEAR-Mail-Paket erfolgen. Die wahren Stärken der PEAR-Mail-Pakete werden erst mit dem Senden von HTML-Mails oder E-Mails mit einem Dateianhang spürbar. Hierzu wird die Klasse mime.php benötigt. Die offizielle Projektseite zum PEAR-Paket Mail_Mime findet ihr unter http://pear.php.net/package/Mail_Mime/.

Bilder



 
Da es keine sehr großen Syntaxunterschiede zwischen Mail und Mail_Mime gibt, findet ihr nachfolgend ein kommentiertes Beispiel, das den Einstieg in die Programmierung mit Mail_Mime ebnen soll.
require_once('Mail/mime.php'); 
require_once('Mail.php'); 
// Das Zeichen für den Zeilenumbruch 
$br="\n"; 
// Die Versandoptionen
$options = array ( 
 'host'      => 'smtp.psd-tutorials.de',
 'auth'      => true,
 'username'  => 'user',
 'password'  => '123456' 
); 
// Das Mail-Objekt
$mailer = Mail::factory('smtp',$options); 
if (true === PEAR::isError($mailer)) { 
   die ($mailer->getMessage()); 
} 
// Die Empfänger-Daten
$empfaenger = 'Michael Mayers <mm@mayers.de>'; 
// Ein neues Mail_Mime-Objekt wird erstellt
// Dem Objekt wird ein Zeilenumbruch zugewiesen
$mail = new Mail_mime($br); 
$mail->setFrom ('Fred Krueger <fk@elmstreet.com>');
// Das ist der Betreff
$mail->setSubject('Test-Mail mit PEAR'); 
// Das ist der Inhalt
// Neben Text ist hier auch eine Grafik angegeben
$mail->setHTMLBody('<html><body> 
   <p>Hallo, Welt</p> 
   <img src="logo.gif" /> 
   </body></html>'); 
// Die Grafik, die in der E-Mail steht
$mail->addHTMLImage('logo.gif'); 
$body = $mail->get(); 
$extra_header=array 
('Content-type'=> 'text/html; charset=UTF-8', 'To' => $empfaenger); 
$headers = $mail->headers($extra_header); 
// Versand der E-Mail
$sender=$mailer->send($empfaenger,$headers,$body);
if (true === PEAR::isError($sender)){ 
   die ($sender->getMessage()); 
}

Dieses Tutorial hat gezeigt, wie einfach sich mittels PHP und PEAR E-Mails verschicken lassen. Ihr könnt die gezeigten Funktionen übrigens auch lokal testen. Eine gute Anleitung dazu findet ihr unter http://jhoyimperial.wordpress.com/2009/05/29/running-php-mail-in-your-local-pc/.

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 15.05.2017 - 00:45

Danke sehr für das informative Tutorial!

Alternative Portrait

-versteckt-(Autor hat Seite verlassen)

  • 03.04.2015 - 13:52

habe das mit dem download von pear nicht ganz verstanden.
muß ich die erweiterung nur lokal installieren ? was ist mit dem server im netz ?

Portrait von dmtw2107
  • 16.11.2013 - 09:48

verständlich und toll erklärt danke für das tutorial

Portrait von toto0104
  • 21.10.2011 - 16:08

Toll gelungen!!! Es könnte - für mich - noch etwas ausführlicher sein.

x
×
×