Dieser Tip ist nicht als Ergänzung sondern als Ersatz zu den alten Tips zum Versenden eines Dokuments via E-Mail zu verstehen. Grund dafür ist, dass der Einsatz von Perl zur Programmierung von Skripten für print2forms-Gateways nicht mehr empfehlenswert ist, weil sich einerseits die Lizenzbedingungen dahingehende verändert haben, dass kommerzieller Einsatz kostenpflichtig ist, und andererseits inzwischen immer weniger Entwickler mit Kenntnissen zu Perl verfügbar sind.
Deshalb wird in diesem Tip das alte Thema jetzt mit der Skriptsprache PHP realisiert.
Da PHP Objekte unterstützt, wurden von uns spezielle Klassen für den Einsatz zusammen mit print2forms programmiert. Diese erleichtern das Programmieren erheblich, weil sie für häufig wiederkehrende Aufgaben bereits vorgefertigte Lösungen anbieten.
Für das Senden von E-Mails werden zwei Klassen benutzt. Zum einen ist das die Klasse control-class.php, die die Analyse von Kontrolldateien unterstützt, und zum anderen ist das die Klasse email-class.php, die - nomen est omen - die Verbindung zu einem E-Mail-Server herstellt. Zum genauen Verständins dieses Tips ist die Kenntnis dieser beiden Klassen notwendig.
Das Skript zum Erzeugen und Versenden von E-Mails muss drei Aufgaben erledigen:
Diese Aufgaben werden im nachfolgend abgebildeten Skript nacheinander erledigt.
Unter dem Link p2fMail.zip steht ein Archiv mit einem vollständigen Projekt zum Austesten des Tips zur Verfügung. 1)
Interessiert nur das Skript alleine, sollte es vorzugsweise über diesen Link mail.php geladen werden, weil beim Laden über den Reiter des Quellcodes die Unicode-BOM verlorengeht. 2)
<?php /* E-Mail sending example - call: "C:\php\php.exe" "%1/mail.php" "%1" "%2" %4 */ require "control-class.php"; require "email-class.php"; if ($argc < 4) control::error ("Invalid number of arguments $argc", 1); $spool = $argv [2]; /* path to spooled document */ $document = $argv [3]; /* name of document without extension */ $p2f = new control("Europe/Berlin", "$spool\\$document.ctl"); $p2f->fetch ("01012D0846", $vars, "(\d+)", "rechnum"); $p2f->fetch ("0102410846", $vars, "(\d+)", "kndnum"); $p2f->fetch ("01036C00C6", $vars, "(.*)", "kndname"); $p2f->fetch ("01050A0229", $vars, "(.*)", "kndmail"); $p2f->fetch ("0102860846", $vars, ".+ (\d+)", "auftrnum"); $p2f->fetch ("0101720846", $vars, "(\d\d\.\d\d\.\d{4})", "rechdatum"); /* PDF file creation with supplied meta data */ $pdf = $p2f->createpdf ("$spool\\$document.pcl", "Lieferant GmbH", "Rechnung {$vars ["rechnum"]}", "{$vars ["rechnum"]}; {$vars ["rechdatum"]}; {$vars ["kndnum"]}"); if ($pdf != "") /* pdf creation successful */ { ( "from" => "info@lieferant-gmbh.local", "fromname" => "Buchhaltung Lieferant GmbH", "to" => $vars ["kndmail"] "toname" => $vars ["kndname"], // "cc" => "", // "ccname" => "", "file" => $pdf, "filename" => "Rechnung {$vars ["rechnum"]}.pdf", "subject" => "Lieferant GmbH - Rechnung {$vars ["rechnum"]}", "body" => $p2f->substitute ("Sehr geehrte Damen und Herren,<br/><br/>" . "vielen Dank für Ihren Auftrag @auftrnum@.<br/><br/>" . "Mit dieser Mail erhalten Sie dazu unsere Rechnung @rechnum@<br/>" . "mit Datum vom @rechdatum@ im Format PDF/A.<br/><br/>" . "Mit freundlichen Grüßen<br/>" . "Ihre Lieferant GmbH<br/><br/><br/>" . "Lieferant GmbH<br/>" . "Lieferweg 21<br/>" . "80345 Musterstadt<br/><br/>" . "Tel.: +49 1234 1234-0<br/>" . "Fax: +49 1234 1234-123<br/><br/>" . "Mail: info@lieferant-gmbh.local<br/><br/>" . "Geschäftsführer: A. Mustermann<br/>" . "Registergericht Musterstadt: 5 HRB 12345<br/>" . "USt-IdNr.: DE123456789<br/>", $vars) ); $em = new email ("server", 465, "user", "password"); if ($em->sendmail ($data, $message) == 0) $p2f->error ("Sending e-mail failed '$message'", 0); } else $p2f->error ("No document available for e-mail", 0); if ($p2f->errorsfound () != 0) ?>
Das Skript startet als erstes mit der Einbindung der beiden notwendigen Klassen in den Zeilen 4 und 5. Danach wird das aktuelle Arbeitsverzeichnis auf das Skriptverzeichnis gesetzt (Zeile 7), um so bei weiteren Dateinamen keine langen Pfade mit angeben zu müssen.
Nach der Prüfung der Argumente (Zeilen 9 bis 13) wird ein zunächst leeres Array zum Aufsammeln der für die E-Mail wichtigen Informationen angelegt (Zeile 15). Dieses Array wird in den Folgezeilen nach und nach mit Texten aus der Kontrolldatei gefüllt. Die regulären Ausdrücke geben für einzelne Daten schon feste Formate vor, so z.B. beim Rechnungsdatum (Zeile 24).
Mit Zeile 28 wird dann die Erzeugung der PDF-Datei initiiert. Neben dem Namen der PCL-Datei wird der Firmenname, eine Dokumentbeschreibung und eine Reihe von Schlüsselworten mitgegeben. Diese werden als Meta-Daten in die PDF-Datei mit eingebaut und erleichtern so die Nachverarbeitung der Datei beim Empfänger.
Ist die PDF-Datei erfolgreich erzeugt worden (Zeile 33), wird nun die E-Mail erzeugt. Dazu wird die in der Klasse email-class.php vorgegebene Schnittstelle erzeugt (Zeilen 35 bis 63). Im personalisierten Text für die E-Mail werden ebenfalls Texte aus der Kontrolldatei mit eingesetzt. Die E-Mail-Adresse und der Klarnamen des Empfängers sind ebenfalls aus der Kontrolldatei extrahierten Texte. Nachdem die Schnittstelle vollständig ist, kann der Versand der E-Mail initiiert werden (Zeile 65). Dazu sind die Kontaktdaten des Mail-Servers notwendig. 3) Der eigentliche Versand erfolgt in Zeile 67. Im Falle eines Fehlschlags wird eine Meldung mit der Fehlernachricht des Mail-Servers ausgegeben. Die Zeilen 73 und 74 sorgen dafür, dass das Skript mit einem Fehlercode terminiert. Dieser Fehlercode wird dann auch in die Ablaufverfolgung des aufrufenden print2forms-Gateways eingetragen. |
Die erzeugte E-Mail im HTML-Format und als reiner Text: