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 8 Mail
  gp 8.1 Mail
  gp 8.2 Mail_Mime
  gp 8.3 Mail_Queue
  gp 8.4 Mail_IMAPv2


Rheinwerk Computing

8.3 Mail_Queue  toptop


Besprochene Version: 1.1.3 Lizenz: PHP
Klassendatei(en): Mail/Queue.php; Mail/Queue/Container/db.php

Mail_Queue ist eine sinnvolle Ergänzung zu den Paketen Mail und Mail_mime. Mail_Queue dient dazu, größere Mengen von Mails zu versenden bzw. die Mail zu einem späteren Zeitpunkt automatisch verschicken zu lassen.

Die Mails werden zu diesem Zweck in einer Datenbank zwischengespeichert. Der Zugriff auf die Datenbank erfolgt hierbei über das Paket PEAR::DB, PEAR::MDB oder PEAR::MDB2, so dass Sie weitgehend datenbankunabhängig sind.

Allerdings muss natürlich die Struktur der Datenbanktabelle bekannt sein. Zum Anlegen der Tabelle nutzen Sie bitte diesen Befehl:

CREATE TABLE mail_queue ( 
 id bigint(20) NOT NULL default '0', 
 create_time datetime NOT NULL default '0000–00–00 00:00:00', 
 time_to_send datetime NOT NULL default '0000–00–00 00:00:00', 
 sent_time datetime default NULL, 
 id_user bigint(20) NOT NULL default '0', 
 ip varchar(20) NOT NULL default 'unknown', 
 sender varchar(50) NOT NULL default '', 
 recipient varchar(50) NOT NULL default '', 
 headers text NOT NULL, 
 body longtext NOT NULL, 
 try_sent tinyint(4) NOT NULL default '0', 
 delete_after_send tinyint(1) NOT NULL default '1', 
 PRIMARY KEY  (id), 
 KEY id (id), 
 KEY time_to_send (time_to_send), 
 KEY id_user (id_user) 
);

Listing 8.3 Anlegen der SQL-Tabelle für Mail_Queue

In dieser Tabelle wird pro E-Mail, die verschickt werden soll, eine eigene Zeile angelegt. Das hat in vielen Fällen sicher zur Folge, dass viele redundante Daten in der Tabelle abgelegt werden. Gerade Massen-E-Mails werden aber gern personalisiert, indem der Name des Empfängers eingefügt wird. Somit macht diese Vorgehensweise Sinn.

Da die Tabelle unabhängig von einer Datenbankarchitektur sein soll, kann hier natürlich nicht auf MySQLs auto_increment zurückgegriffen werden. Das Paket nutzt üblicherweise eine Sequenz, die von den Datenbankpaketen bereitgestellt wird, um eine eindeutige ID zu generieren. Sollte das für Ihre Datenbank nicht funktionieren, können Sie auch eine Tabelle anlegen, die immer eine eindeutige Integer-Zahl zurückgibt. Diese Tabelle sollte dann den Namen mail_queue_seq haben.

Zum Versenden der E-Mails wird PEAR::Mail genutzt, so dass Sie sie über einen externen SMTP-Server, sendmail oder die Funktion mail() versenden können.

Da sowohl das PHP-Script zum Einfügen der E-Mails als auch das zum Versenden der E-Mails dieselben Konfigurationsdaten benötigen, ist es sinnvoll, diese in eine externe Datei auszulagern. Hierin müssen sowohl die Informationen für den Datenbankzugriff als auch für die Konfigurationsdaten für PEAR::Mail enthalten sein.

Die Datei könnte so aufgebaut sein wie in Listing 8.4.

// Einbinden der Klassen-Datei 
require_once ('Mail/Queue.php'); 
 
// Datenbankpaket, das genutzt werden soll: db, mdb oder mdb2 
$db_options['type']       = 'db'; 
 
// DSN zur Datenbankverbindung 
$db_options['dsn']= 'mysql://user:geheim@localhost/datenbank'; 
// Name der Tabelle, die genutzt werden soll 
$db_options['mail_table'] = 'mail_queue'; 
 
// Konfigurationsdaten fuer PEAR::Mail 
$mail_options['driver']   = 'smtp'; 
$mail_options['host']     = 'smtp.example.com'; 
$mail_options['port']     = 25; 
$mail_options['auth']     = true; 
$mail_options['username'] = 'user'; 
$mail_options['password'] = 'geheim';

Listing 8.4 Aufbau der Konfigurationsdatei für Mail_Queue

Informationen zum Aufbau des DSNs übernehmen Sie bitte aus Abschnitt 15.1 zu PEAR::DB.

Die Informationen zur Konfiguration von PEAR::Mail finden Sie in Abschnitt 8.1 zu PEAR::Mail auf Seite 223.

Um eine neue E-Mail für den Versand vorzubereiten, nutzen Sie die Methode put(). put() bekommt mindestens vier Parameter übergeben. Hierbei handelt es sich um die E-Mail-Adresse des Absenders und die des Empfängers, die an den beiden ersten Stellen der Parameterliste zu übergeben sind. Danach folgt ein assoziatives Array mit den Headern, wie sie von PEAR::Mail akzeptiert werden. Der letzte obligatorische Parameter ist schließlich der eigentliche Inhalt der Mail.

Danach können Sie mithilfe einer Anzahl von Sekunden definieren, wann die E-Mail gesendet werden soll. Hierbei handelt es sich um die Anzahl von Sekunden zwischen dem jetzigen Zeitpunkt und dem Zeitpunkt, zu dem der erste Sendeversuch zulässig ist. Die E-Mail wird nicht automatisch verschickt.

Mit dem nächsten Wert, der true oder false sein kann, definieren Sie, ob der Eintrag für die E-Mail nach dem Senden aus der Tabelle gelöscht werden soll. Der letzte Wert schließlich, eine Integer-Zahl, ist vorgesehen, um darüber eine Benutzerverwaltung zu ermöglichen. Hier kann also die Benutzer-ID des Senders abgelegt werden.

Die Weise, wie die Parameter an die Methode put() übergeben werden, orientiert sich an dem, was Mail_mime an Daten zurückgibt. Da die Autoren von Mail_Queue wohl auch dieser Ansicht sind, wird die Datei Mail/mime.php schon automatisch inkludiert. Somit empfiehlt es sich, die Pakete zu kombinieren, wie Sie in Listing 8.5 sehen können.

// Uebernahme der Konfiguration fuer Mail-Server und Datenbank 
require_once('config.php'); 
 
// Daten fuer Mail festlegen 
$from = 'info@example.com'; 
$to = 'Carsten Moehrke <cmoehrke@netviser.de>'; 
$message = 'Nur ein Test'; 
 
$headers = array( 'From'    => $from, 
                  'To'      => $to, 
                  'Subject' => 'Mail aus dem Netz' 
           ); 
 
// Ableiten eines Mail_mime-Objekts und Aufbau der Mail 
$mime = new Mail_mime(); 
$mime->setTXTBody($message); 
$body = $mime->get(); 
$header_arr = $mime->headers($headers); 
 
// Neues Queue-Objekt ableiten und Optionen uebergeben 
$mail_queue = new Mail_Queue($db_options, $mail_options); 
 
//Mail hinzufuegen; Versand in 28800 Sekunden = 8 Stunden 
$res=$mail_queue->put( $from, $to, $header_arr, $body, 28800); 
if (true === PEAR::isError($res)) 
{ 
   die ("Fehler: ".$res->getMessage()); 
} 
else 
{ 
   echo "Die E-Mail wurde f&uuml;r die Auslieferung 
         vorbereitet und hat die ID $res"; 
}

Listing 8.5 Vorbereiten einer E-Mail für das Versenden

put() gibt entweder ein PEAR_Error-Objekt oder die ID zurück, unter der die Daten in die Tabelle eingefügt wurden. Über diese ID können Sie einzelne E-Mails später explizit ansprechen, wenn das nötig sein sollte.

Nachdem Sie eine oder mehrere Mails hinzugefügt haben, können Sie den Versand zu einem bestimmten Zeitpunkt starten. In diesem Beispiel ist das Script so ausgelegt, dass Sie es im Browser aufrufen können und dass dann eine bestimmte Anzahl von Mails verschickt wird. So ein Script könnte natürlich auch in regelmäßigen Zeitabständen durch den Server selbst in Form eines Cron-Jobs aufgerufen werden.

Die einfachste Möglichkeit, Mails zu versenden, ist die Methode sendMailsInQueue(). Sie bekommt als Parameter die Anzahl der Mails übergeben, die maximal gesendet werden sollen. Der Sinn dieser Beschränkung ist, dass eine zu lange Script-Laufzeit bzw. eine Überlastung von Datenbank und Webserver vermieden werden soll. Die Methode liest dann die entsprechende Anzahl von Datensätzen aus der Tabelle aus und verschickt sie. Die Methode beachtet hierbei auch, ob die E-Mails für einen späteren Versand vorgesehen sind.

require_once('config.php'); 
 
// Anzahl der Mails, die maximal pro Aufruf verschickt werden 
$max_mails = 30; 
 
// Neues Mail_Queue-Objekt ableiten 
$mail_queue = new Mail_Queue($db_options, $mail_options); 
 
// E-Mails versenden 
$res=$mail_queue->sendMailsInQueue($max_mails); 
if (true===PEAR::isError($res)) 
{ 
   die ($res->getMessage()); 
}

Listing 8.6 Versenden von E-Mails

Alternativ können Sie den Versand einer einzelnen E-Mail auch mit der Methode sendMailById() initiieren. Die Methode bekommt als Parameter die ID einer E-Mail übergeben und verschickt diese. Hierbei beachtet sie nicht, ob eine bestimmte Uhrzeit für den Versand eingetragen ist, und sie löscht den Datensatz auch nicht aus der Tabelle. Dafür trägt sie aber die Uhrzeit ein, wann die Mail versandt wurde.

Sie können aber auch eine komplette Applikation zur Verwaltung der Datensätze in der Queue aufbauen. Hierzu ist eine Vielzahl von Methoden vorgesehen, mit denen Sie die einzelnen Bestandteile der Datensätze auslesen können.

Als Erstes benötigen Sie aber direkten Zugriff auf die Warteschlange in der Datenbank, wozu die Klasse Mail_Queue_Container_db vorgesehen ist. Ihr Konstruktor bekommt dieselben Datenbank-Optionen übergeben, die auch schon bei Mail_Queue Verwendung fanden.

Mit einem Objekt dieser Klasse können Sie nun die Methode getMailById() aufrufen, die die ID eines Datenbankeintrags übergeben bekommt. Die Methode gibt ein Mail_Queue_Body-Objekt zurück. Alternativ können Sie auch die Methode get() nutzen, die immer die jeweils nächste E-Mail aus der Warteschlange ausliest.

Bevor ich darauf eingehe, möchte ich noch ein Wort zu den anderen Methoden sagen, die die Klasse Mail_Queue_Container_db zur Verfügung stellt.

Mit der Methode deleteMail() können Sie einen vorbereiteten Eintrag für eine E-Mail löschen. Die Methode bekommt die ID der E-Mail als Parameter übergeben.

Des Weiteren sind die Methoden countSend() und setAsSent() definiert. Mit ihnen können Sie feststellen, wie oft eine E-Mail schon verschickt wurde, bzw. Sie können einen bestehenden Eintrag für eine E-Mail als versendet markieren. Diese Methoden bekommt aber nicht die ID eines Eintrags übergeben, sondern ein Mail_Queue_Body-Objekt, das mit get() oder getMailById() ausgelesen wurde:

require_once('config.php'); 
require_once('Mail/Queue/Container/db.php'); 
 
$queue=new Mail_Queue_Container_db($db_options); 
 
$mail=$queue->getMailById(23); 
$queue->setAsSent($mail);

Nun aber zurück zum Mail_Queue_Body-Objekt. Um ausgeben zu können, welche Informationen in dem Datenbankeintrag enthalten sind, können Sie die Methoden aus Tabelle 8.1 nutzen.


Tabelle 8.1 Methoden der Klasse Mail_Queue_Body
Methode Beschreibung
getBody() Gibt den Inhalt der Mail zurück.
getCreateTime() Liefert das Datum und die Uhrzeit der Erstellung zurück; das Format ist (JJJJ-MM-TT HH:MM:SS).
getHeaders() Liefert die Header in der Form zurück, in der sie eingetragen wurden (Array oder String).
getId() Liefert den Inhalt des Felds ID zurück.
getIdUser() Alias für getId().
getIp() Gibt die IP-Adresse des Rechners zurück, über den der Eintrag vorgenommen wurde.
getRecipient() Gibt Ihnen den Empfänger der E-Mail zurück.
getSender() Gibt Ihnen den Absender der E-Mail zurück.
getSentTime() Datum und Uhrzeit, wann die E-Mail verschickt wurde.
getTimeToSend() Liest die Uhrzeit aus, wann eine E-Mail gesendet werden soll. Wurde keine Sendezeit angegeben, wird die Zeit zurückgegeben, zu der der Eintrag angelegt wurde.
getTrySent() Die Anzahl der Sendeversuche.
isDeleteAfterSend() Diese Methode gibt eine 1 zurück, wenn der Datenbankeintrag nach dem Senden gelöscht werden soll, und sonst eine 0.

Mit diesen Methoden können Sie eine elegante Verwaltung der Mails aufbauen.

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
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.


Nutzungsbestimmungen | Datenschutz | Impressum

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

Cookie-Einstellungen ändern