Dokument via E-Mail in PHP versenden

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 Ver­bindung zu einem E-Mail-Server herstellt. Zum genauen Verständins dieses Tips ist die Kenntnis dieser beiden Klassen notwendig.

Quellcode

Das Skript zum Erzeugen und Versenden von E-Mails muss drei Aufgaben erledigen:

  1. Auslesen der Kontrolldatei, um Informationen zur Erzeugung des Inhalts der E-Mail zu erhalten - z.B. den Namen des Adressaten oder die Rechnungsnummer. Idealerweise ist auch die E-Mail-Adresse des Adressaten in der Kontroldatei zu finden, falls nicht, muss sie eventuell aus anderen Quellen, wie z.B. aus einer Datenbank, ermittelt werden.

  2. Konvertierung der Druckausgabe (die PCL-Datei) in eine PDF-Datei.

  3. Erzeugung des E-Mail-Textes, Einbindung der PDF-Datei und Versand der E-Mail.

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)

mail.php
  1. <?php
  2. /* E-Mail sending example - call: "C:\php\php.exe" "%1/mail.php" "%1" "%2" %4 */
  3.  
  4. require "control-class.php";
  5. require "email-class.php";
  6.  
  7. chdir (dirname(__FILE__)); /* active directory is script directory */
  8.  
  9. if ($argc < 4)
  10. control::error ("Invalid number of arguments $argc", 1);
  11.  
  12. $spool = $argv [2]; /* path to spooled document */
  13. $document = $argv [3]; /* name of document without extension */
  14.  
  15. $vars = array ();
  16.  
  17. $p2f = new control("Europe/Berlin", "$spool\\$document.ctl");
  18.  
  19. $p2f->fetch ("01012D0846", $vars, "(\d+)", "rechnum");
  20. $p2f->fetch ("0102410846", $vars, "(\d+)", "kndnum");
  21. $p2f->fetch ("01036C00C6", $vars, "(.*)", "kndname");
  22. $p2f->fetch ("01050A0229", $vars, "(.*)", "kndmail");
  23. $p2f->fetch ("0102860846", $vars, ".+ (\d+)", "auftrnum");
  24. $p2f->fetch ("0101720846", $vars, "(\d\d\.\d\d\.\d{4})", "rechdatum");
  25.  
  26. /* PDF file creation with supplied meta data */
  27.  
  28. $pdf = $p2f->createpdf ("$spool\\$document.pcl",
  29. "Lieferant GmbH",
  30. "Rechnung {$vars ["rechnum"]}",
  31. "{$vars ["rechnum"]}; {$vars ["rechdatum"]}; {$vars ["kndnum"]}");
  32.  
  33. if ($pdf != "") /* pdf creation successful */
  34. {
  35. $data = array
  36. (
  37. "from" => "info@lieferant-gmbh.local",
  38. "fromname" => "Buchhaltung Lieferant GmbH",
  39. "to" => $vars ["kndmail"]
  40. "toname" => $vars ["kndname"],
  41. // "cc" => "",
  42. // "ccname" => "",
  43. "file" => $pdf,
  44. "filename" => "Rechnung {$vars ["rechnum"]}.pdf",
  45. "subject" => "Lieferant GmbH - Rechnung {$vars ["rechnum"]}",
  46. "body" =>
  47.  
  48. $p2f->substitute ("Sehr geehrte Damen und Herren,<br/><br/>" .
  49. "vielen Dank für Ihren Auftrag @auftrnum@.<br/><br/>" .
  50. "Mit dieser Mail erhalten Sie dazu unsere Rechnung @rechnum@<br/>" .
  51. "mit Datum vom @rechdatum@ im Format PDF/A.<br/><br/>" .
  52. "Mit freundlichen Grüßen<br/>" .
  53. "Ihre Lieferant GmbH<br/><br/><br/>" .
  54. "Lieferant GmbH<br/>" .
  55. "Lieferweg 21<br/>" .
  56. "80345 Musterstadt<br/><br/>" .
  57. "Tel.: +49 1234 1234-0<br/>" .
  58. "Fax: +49 1234 1234-123<br/><br/>" .
  59. "Mail: info@lieferant-gmbh.local<br/><br/>" .
  60. "Geschäftsführer: A. Mustermann<br/>" .
  61. "Registergericht Musterstadt: 5 HRB 12345<br/>" .
  62. "USt-IdNr.: DE123456789<br/>", $vars)
  63. );
  64.  
  65. $em = new email ("server", 465, "user", "password");
  66.  
  67. if ($em->sendmail ($data, $message) == 0)
  68. $p2f->error ("Sending e-mail failed '$message'", 0);
  69. }
  70. else
  71. $p2f->error ("No document available for e-mail", 0);
  72.  
  73. if ($p2f->errorsfound () != 0)
  74. exit (-1);
  75. ?>


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 Meta-Daten der vom Skript erzeugte PDF-Datei


Die erzeugte E-Mail im HTML-Format und als reiner Text:

Die E-Mail mit Anhang im HTML-Format

Die E-Mail mit Anhang im Text-Format



Hinweise



1)
Ein Projekt für Visual Studio Code mit lokal installierten PHP. Inklusive der benötigten Klassen und Testdaten.

2)
Für die korrekte Funktion der Skripte ist es unumgänglich, dass Unicode zum Einsatz kommt. Die Kontrolldatei ist eine in UTF-8 kodierte Datei und somit müssen auch die zur Verarbeitung genutzten Skripte Unicode unterstützen. Ansonsten gibt es erhebliche Probleme mit länderspezifischen Zeichen. Die regulären Ausdrücke im Skript mail.php müssen aber ohne 'u' angegeben werden, weil dies in der Methode fetch automatisch ergänzt wird! Für eigene reguläre Ausdrücke ist aber der Modifier 'u' am Ende der RegEx zwingend!

3)
Falls dies nicht in jedem Skript extra konfiguriert werden soll, weil dies den Wartungsaufwand im Falle von Änderungen am Mail-System erhöht, kann eine Vorbelegung der Kontaktdaten des Mail-Servers bereits in der Klasse email-class.php mittels initialisierter Parameter erfolgen. Im aufrufenden Skript müssen dann keine Parameter mehr angegeben werden.