Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 9 Networking
  gp 9.1 Net_IPv4
  gp 9.2 Net_IPv6
  gp 9.3 Net_FTP
  gp 9.4 Net_POP3
  gp 9.5 Net_SMTP
  gp 9.6 Net_CheckIP
  gp 9.7 Net_IDNA
  gp 9.8 Net_Curl
  gp 9.9 Net_Socket
  gp 9.10 Net_UserAgent_Detect


Rheinwerk Computing

9.5 Net_SMTP  toptop


Besprochene Version: 1.2.6 Lizenz: PHP-Lizenz
Klassendatei(en): Net/SMTP.php

Das Versenden einer E-Mail mithilfe von PHP ist denkbar einfach. Die Funktion mail() hat allerdings den Nachteil, dass die ausgehende Mail standardmäßig über den Mailserver verschickt wird, der auf dem lokalen Rechner installiert ist. Das kann aber den Nachteil haben, dass die versandte E-Mail in Spam-Filtern hängen bleibt. Möchten Sie die Mail über einen anderen SMTP-Server versenden, ist das nicht so einfach. An dieser Stelle kann das Paket Net_SMTP Ihnen aber hilfreich zur Seite stehen. Anzumerken ist allerdings, dass Net_SMTP primär eine Implementation des SMTP-Protokolls darstellt und nicht unbedingt direkt für den Versand von Mails gedacht ist. Somit stellt das Paket eine gute Basis für eine eigene Mail-Klasse dar.

Net_SMTP ermöglicht es Ihnen, E-Mails über einen beliebigen SMTP-Server zu versenden, auf dem Sie über einen Account verfügen. Das Paket implementiert das Protokoll nach RFC 2821 [http://www.faqs.org/rfcs/rfc2821.html ] und benötigt PEAR::Net_Socket, um arbeiten zu können. Interessant ist hierbei, dass Net_SMTP nicht nur die SMTP-Standard-Authentifizierung nach RFC 2554 [http://www.faqs.org/rfcs/rfc2554.html ] unterstützt, sondern dass es auch einige andere Verfahren kennt.

Der Konstruktor bekommt den Host-Namen bzw. seine IP-Adresse übergeben und liefert das benötigte Net_SMTP-Objekt zurück. Nachdem das geschehen ist, müssen Sie eine Verbindung zu dem Server aufbauen, was die Methode connect() für Sie übernimmt. Allerdings möchte der Server in den meisten Fällen noch eine Authentifizierung durch Usernamen und Passwort von Ihnen haben. Das SMTP-Protokoll sieht nicht zwingend eine Authentifizierung vor. Allerdings sollte das inzwischen Standard sein, so dass es als ein Sicherheitsleck zu betrachten ist, wenn keine Authentifizierung erfragt wird.

Die Methode auth(), die Sie an dem Server anmeldet, bekommt den Usernamen und das Passwort übergeben. Üblicherweise benötigt sie keine Information, welche Methode genutzt werden soll, da sie selbst die beste ermittelt. Möchten Sie die Methode selbst festlegen, können Sie als dritten Parameter allerdings auch einen der Strings DIGEST-MD5, CRAM-MD5, LOGIN oder PLAIN übergeben. Möchten Sie eines der MD5-Verfahren nutzen, muss das Paket AUTH_SASL installiert sein.

// Neues Objekt instanziieren 
$smtp = new Net_SMTP("smtp.netviser.de"); 
// Debug-Modus einschalten 
$smtp->setDebug(true); 
 
// Verbindung zum Server aufbauen 
$erg = $smtp->connect(); 
if (PEAR::isError($erg)) 
{ 
   die($erg->getMessage()); 
} 
 
// Authentifizierung 
$erg=$smtp->auth("cmoehrke","geheim"); 
if (PEAR::isError($erg)) 
{ 
   die($erg->getMessage()); 
} 
 
// Code zum Versenden der Mail 
 
// Verbindung beenden 
$smtp->disconnect();

Listing 9.6 Verbindungsaufbau zu einem SMTP-Server

In Listing 9.6 sehen Sie die Vorgehensweise, um die Verbindung zu einem Server auf- bzw. wieder abzubauen. In diesem Beispiel wird noch die zusätzliche Methode setDebug() genutzt. Übergeben Sie Ihr ein true, was Sie nur während der Entwicklungszeit machen sollten, bekommen Sie am Ende des Scripts eine Zusammenfassung der Kommunikation mit dem Server ausgegeben.

Das disconnect() in der letzten Zeile beendet die Verbindung zum Server, so dass er nicht auf ein Timeout warten muss. Da die E-Mail erst dann verschickt wird, wenn der Server erkennt, dass die Verbindung beendet ist, kann ein korrektes Disconnect auch einen deutlichen Zeitvorteil nach sich ziehen.

Nun stellt sich nur noch die Frage, wie Sie eine E-Mail versenden können. Essenziell wichtig sind hierbei der Absender, der Empfänger und natürlich der Inhalt der Mail, die jeweils mit eigenen Methoden an das Objekt übergeben werden.

$erg=$smtp->mailFrom("absender@example.com"); 
if (PEAR::isError($erg)) 
{ 
   die($erg->getMessage()); 
} 
 
$erg = $smtp->rcptTo("empfaenger@example.com"); 
if (PEAR::isError($erg)) 
{ 
   die($erg->getMessage()); 
} 
 
$betreff="Subject: Betreffzeile der Mail"; 
$body = "Eine Mail mit zwei\nZeilen."; 
$erg=$smtp->data("$betreff\n$body"); 
if (PEAR::isError($erg)) 
{ 
    die($erg->getMessage()); 
}

Listing 9.7 Versenden einer E-Mail

Wie Empfänger, Absender und der Inhalt der Mail gesetzt werden, sehen Sie in Listing 9.7. Die E-Mail-Adresse des Absenders wird mit der Methode mailFrom() festgelegt, wohingegen der Empfänger durch rcptTo() definiert wird. Interessant ist hierbei, dass Sie für eine E-Mail durchaus mehrere Empfänger festlegen können, indem Sie die Methode mehrfach aufrufen.

Die Methode data() legt den eigentlichen Inhalt der Mail fest. Sie bekommt sowohl den Betreff als auch den eigentlichen Body der Mail übergeben. Wichtig hierbei ist, dass die Betreffzeile mit dem Schlüsselwort Subject: eingeleitet wird und mit einem Zeilenumbruch vom eigentlichen Körper der Mail abgetrennt wird.

Alle Methoden, die zum Definieren der eigentlichen Mail dienen, schicken die Informationen sofort an den Server. Somit ist es sinnvoll, das Ergebnis jeder Methode darauf zu prüfen, ob ein Fehler zurückgeliefert wurde.

Beim Versand von Mails müssen Sie beachten, dass der Körper der Mail so verschickt wird, wie Sie ihn übergeben haben. Die einzige Änderung, die das Paket selbstständig vornimmt, ist die Konvertierung von Zeilenumbrüchen. Ein \n oder ein \r wird also automatisch in ein \r\n konvertiert, um eine Konformität mit dem RFC zu gewährleisten.

Sollte Ihr Mailserver keine Zeilenumbrüche im Format \r\n akzeptieren, was in einigen Fällen vorkommen kann, oder benötigen Sie aus anderen Gründen eine eigene Routine zum automatischen Konvertieren des Bodys, können Sie die bestehende Methode überladen. Dazu müssen Sie eine Subklasse ableiten, in der die neue Methode implementiert wird.

class My_Net_SMTP extends Net_SMTP 
{ 
   function quotedata(&$data) 
   { 
     $data = preg_replace("/([^\r]{1})\n/", "\\1\r\n", $data); 
     $data = preg_replace("/\n\n/", "\n\r\n", $data); 
 
     $data = preg_replace("/\n\./", "\n..", $data); 
   } 
}

Der Quelltext der hier dargestellten Methode entspricht dem Original. Die ersten beiden Zeilen konvertieren die Zeilenumbrüche. Die letzte Zeile konvertiert einen einfachen Punkt am Anfang einer Zeile in zwei Punkte. Der Grund dafür ist, dass ein einfacher Punkt am Zeilenanfang das Ende der Mail symbolisiert. Wie gesagt können Sie die Methode jederzeit überladen, wenn das nötig sein sollte.

Die Klasse unterstützt aber noch eine ganze Menge weiterer Befehle, die im SMTP-Protokoll definiert sind. Hiervon ist die Methode rset() sicher noch hilfreich. Mit ihr kann eine Mail, die bereits in Teilen an den Server übergeben wurde, wieder gelöscht werden. Stellen Sie also fest, dass der eigentliche Inhalt der Mail ungültig ist, nachdem Sie bereits den Absender übergeben haben, so löscht ein Aufruf von rset() die bereits übergebenen Daten. Andere Befehle wie NOOP (No Operations) sind auch implementiert. Da sie jedoch eher selten benötigt werden, gehe ich nicht weiter auf sie ein.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de