===== Dokument via E-Mail versenden II ===== Dieser Tip ist als Ergänzung zum alten Tip [[print2forms:tips:tip27|Dokument via E-Mail versenden]] zu sehen. Grund für die Ergänzung sind weitere Möglichkeiten der **Gestaltung** der E-Mail und deren Versand über eine **gesicherte Verbindung**. In diesem Zusammenhang soll auch noch einmal erwähnt werden, dass die Erzeugung von PDF-Dateien als Anhang von E-Mails nicht mehr mit dem Programm der amerikanischen Firma Lincoln & Co erfolgen sollte. Nach einem Verkauf der Firma ist das Programm nicht mehr am Markt erhältlich und es gibt keinen Support mehr. Abgesehen davon unterstützt es einige neue Funktionen von (p2f) nicht. ((Vornehmlich Probleme mit Farbdruck, gedrehtem Text und vor allem alles im Kontext der Nutzung von Unicode.\\ \\ )) Als Alternative bietet sich das Programm [[https://www.ghostscript.com/releases/gpcldnld.html|GhostPCL]] an. Damit lassen sich nicht nur PDF-Dateien erzeugen, sondern auch fast alle Arten von Bilddateien generieren, sodass zur Not auch noch ein Fax-Anschluss realisiert werden könnte. ((**GhostPCL** steht unter einer modifizierten GNU-Lizenz - der [[https://www.gnu.org/licenses/agpl-3.0.html|AGPL]] - die auch die kommerzielle Nutzung erlaubt.\\ \\ )) Wie konkret eine PDF-Datei mit (p2f) erzeugt werden kann, ist zum einen dem Tip [[print2forms:tips:tip85|PDF-Datei erzeugen]] zu entnehmen. Zusätzlich wird hier das Vorgehen beim Einsatz mit Perl gezeigt. \\ \\ ==== Der neue Ansatz ==== Die Gestaltung ansprechender E-Mail Inhalte erfordert heutzutage den Einsatz von HTML für den lesbaren Inhalt der Mail. Gleichzeitig sollte aber auch eine reine Textversion dieses Inhalts in der Mail enthalten sein, weil aus Gründen der Sicherheit viele Mail-Clients nur reine Texte anzeigen und darauf verzichten, den durchaus korrumpierbaren %%HTML%%-Teil zu interpretieren. Deshalb muss die zu erzeugende E-Mail aus drei Teilen bestehen, die richtig verschachtelt werden müssen. Der Text der E-Mail zusammen mit dem oder den Anhängen bildet den äusseren Rahmen der Mail (multipart/mixed), und der Inhalt ist seinerseits in zwei alternativ anzuzeigende Text- und %%HTML%%-Inhalte aufgeteilt (multipart/alternative). \\ \\ ==== Variable Inhalte ==== Grundlage für die dynamischen Inhalte ist ein einfacher Schablonen-Mechanismus, der Texte innerhalb einer %%HTML%%- oder Text-Vorlage gegen Texte ersetzt, die mit (p2f) ermittelt worden sind. Das ist am einfachsten mit dem %%Perl%%-Paket 'HTML:Lite' und dem Paket 'Template' zu realisieren. ((Das als möglicherweise besser geeignet erscheinende %%Perl%%-Paket %%MIME::Lite:TT:HTML%% ist nicht in der Lage, eine E-Mail mit der gewünschten Struktur zu erstellen. Wenn allerdings nur ein %%HTML%%- oder ein Text-Teil zusammen mit einem oder mehreren Anhängen gefordert sind, ist das Paket durchaus einsetzbar.\\ \\ )) ((Ist auf dem Rechner [[https://strawberryperl.com|Strawberry Perl]] installiert, muss das Paket '%%HTML:Lite%%' nachinstalliert werden. Das geschieht am einfachsten in einer Eingabeaufforderung. Dort wird der Befehl ''(sp)cpan %%HTML%%:Lite(sp)'' ausgeführt. Das Paket wird dann aus dem Internet geladen und auf dem aktuellen Rechner übersetzt und installiert.\\ \\ )) ((Bei älteren Versionen von [[https://www.activestate.com/products/perl/|ActiveState Perl]] kann das Paket '%%HTML:Lite%%' über den eingebauten Paket-Manager bereitgestellt werden. Das geschieht am einfachsten in einer Eingabeaufforderung. Dort wird der Befehl ''(sp)ppm install %%HTML%%:Lite(sp)'' ausgeführt. Das Paket wird dann aus dem Internet geladen und auf dem aktuellen Rechner übersetzt und installiert.\\ \\ )) ((Die Nutzung von neueren Versionen von [[https://www.activestate.com/products/perl/|ActiveState Perl]] (ab 5.28) wird von der SPE Systemhaus GmbH aus lizenzrechtlichen Gründen nicht mehr empfohlen.\\ \\ )) Im nachfolgenden Skript wird als Schablone für den **%%HTML%%-Teil** der E-Mail eine Datei mit dem Namen 'mail.html' eingesetzt, die hier als erstes abgebildet ist. In dieser %%HTML%%-Datei sind die variablen Texte in eckigen Klammern mit Prozentzeichen notiert. Diese Schablone kann auch Bezug auf externe Ressourcen wie etwa auf Web-Servern gelagerte Bilder (Firmenlogos) nehmen. ((Im Beispiel wird ein Hintergrundbild über die Einbindung von CSS genutzt. Auffällig ist hier, daß alles %%CSS%% inline notiert ist. Das muss aber nicht so sein, sondern kann auch über eine auf einem Web-Server hinterlegte %%CSS%%-Datei realisiert werden, was die E-Mail sogar deutlich kleiner werden liesse.\\ \\ )) \\ \\ Ihre Bestellung [% Bestellnummer %]
SPE Systemhaus GmbH
Waldstrasse 7
D-63150 Heusenstamm

Tel.: +49 6106 860560
Fax: +49 6106 860583

Lieferschein für Bestellung [% Bestellnummer %]

[% Anschrift1 %]
[% Anschrift2 %]
[% Anschrift3 %]
[% Anschrift4 %]


Sehr geehrte Damen und Herren,

Mit dieser automatisch erzeugten Nachricht erhalten Sie den Lieferschein zu Ihrer Bestellung [% Bestellnummer %].

Mit freundlichen Grüßen
SPE Systemhaus GmbH

Geschäftsführer: Dipl. Inform. Volker Süßmann
Amtsgericht: Offenbach am Main, HRB 8132

USt-IdNr.: DE113585835
WEEE-Reg-Nr.: DE97546258

https://www.spe-systemhaus.de

\\ Auch im **Text-Teil** der E-Mail werden die variablen Daten mit eckigen Klammern und Prozentzeichen markiert. Der Inhalt des Text-Teils kann vollkommen unabhängig vom %%HTML%%-Teil formuliert werden. Aufgrund der Spezifikationen für SMTP ist darauf zu achten, dass im Text-Teil für das Zeilenende lediglich **Linefeeds** genutzt werden dürfen - eventuell vorhandene Carriage Returns erzeugen Leerzeilen. \\ \\ Lieferschein zur Bestellung [% Bestellnummer %] Sehr geehrte Damen und Herren, im Anhang finden Sie den Lieferschein zu Ihrer Bestellung. Mit freundlichen Grüßen SPE Systemhaus GmbH \\ Beide Dateien müssen im **gleichen Verzeichnis** abgelegt werden, wie das nachfolgende Skript! \\ \\ ==== Das Skript ==== Das Perl-Skript ((Aus Gründen der Kompatibilität mit den bisherigen Lösungen ist das Skript ebenfalls noch in Perl formuliert, obwohl die SPE Systemhaus GmbH für aktuelle Entwicklungen eher den Einsatz von PHP als Skriptsprache favorisiert. Siehe dazu die Tips [[print2forms:tips:tip71|Test von PHP Skripten]] und [[print2forms:tips:tip72|PHP-Skript ohne Gateway testen]].\\ \\ )) liest zunächst aus der vom (p2f)-Gateway erzeugten **Kontrolldatei** die variablen Daten aus. Anschliessend wird die PCL-Datei mit dem Lieferschein durch den Aufruf von **GhostPCL** in eine %%PDF%%-Datei konvertiert. ((Für das Beispiel in diesem Tip wird auf die mit der Free-Edition von (p2f) mitgelieferte Beispiel-Applikation zurückgegriffen, die im [[print2forms:tutorial:inhalt:lieferscheine|Tutorial]] beschrieben ist.\\ \\ )) \\ \\ [Time]13.03.23 08:46:30 [Computer]kvasir [User]Volker [Model]p2f Gateway [Job]Lieferschein [File]1 [Process]ANLAGEN.XML [0102C10000] 00001/3 [0103390000] 1704 [0103750000] Kunde AG [0103B10000] z. Hd. Hr. X. Kunde 347-57897 [0104290000] Kundengasse 19 15595 [0104650000] D-48535 Kundendorf [0104A10000] Hr. G. Muster [0105190000] 13.03.2023 [0106810000] 1 L1BL50 Schaltlitze 0,14x50 m blau St 330 0 330 [0106F90000] 2 L1BL500 Schaltlitze 0,14x500 m blau St 50 0 50 [0107710000] 3 USB2AA1 USB Kabel A/A Stecker 1.0 m St 210 21 189 [Page] [End] \\ Der strukturelle Aufbau des Skriptes ist daher wie folgt: * Als erstes wird die von (p2f) erzeugte Kontrolldatei (s.o.) geöffnet, und alle variablen Informationen werden in Variablen übernommen, um sie später in die Vorlagen einsetzen zu können. * Dann wird aus den %%PCL%%-Daten, die von (p2f) erzeugt wurden (hier ein Lieferschein), eine %%PDF%%-Datei erzeugt. Dies geschieht in zwei Schritten. Als erstes wird ein PJL-Kommando erzeugt und in eine Datei geschrieben. Dieses Kommando liefert die Meta-Daten für die %%PDF%%-Datei, wie beispielsweise den Autor oder Schlüsselworte. Dann erfolgt die eigentliche Erzeugung der %%PDF%%-Datei, hier als PDF-A. * Als nächstes werden die Vorlagen für den %%HTML%%- und den Text-Teil bearbeitet, indem die Platzhalter gegen die aktuellen Werte aus der Kontolldatei ersetzt werden. Dazu wird eine Abbildung der Platzhalternamen auf die Namen der %%Perl%%-Variablen erzeugt. * Dann wird die eigentliche E-Mail zusammengebaut. Mit der Erzeugung des Mail-Objekts wird der äussere Rahmen (multipart/mixed) erzeugt. An diesen wird ein weiterer Rahmen angehängt (multipart/alternative). Dieser innere Rahmen wird mit dem Text- und dem %%HTML%%-Teil der E-Mail bestückt. Als letztes wird jetzt die %%PDF%%-Datei an den äusseren Rahmen angehängt. * Als letztes wird die E-Mail über eine **gesicherte Verbindung** versandt. ((Die im Skript verwendeten **E-Mail-Adressen** sind natürlich anzupassen. Insbesondere ist die Empfängeradresse seltenst konstant, sondern wird den Druckdaten oder gar einer Datenbank entnommen. Das wurde aber wegen der Übersicht(-)lichkeit des Beispiels hier einmal bewusst außer Acht gelassen.\\ \\ )) \\ #!/usr/bin/perl # # Command: perl email.pl "%1" "%2" "%4" # # Call: perl email.pl Scriptpath Spoolpath Filename # use strict; use warnings; use MIME::Lite; use Template; #------------------------------------------------------------------------------# my $Script = $ARGV [0]; # Params: Scriptpfad Spoolpfad Dateiname my $Spool = $ARGV [1]; my $Name = $ARGV [2]; my $PCLFile = $Spool . "\\" . $Name . ".pcl"; my $CTLFile = $Spool . "\\" . $Name . ".ctl"; my $PDFFile = $Spool . "\\" . $Name . ".pdf"; my $PJLFile = $Spool . "\\pjl.pjl"; my ($Anschrift1, $Anschrift2, $Anschrift3, $Anschrift4, $Bestellnummer, $Liefernummer, $Id, $mail_html, $mail_text); open (CTL, "<$CTLFile") or die "Kann $CTLFile nicht finden\n"; # Auf gültige Kontrolldatei prüfen --------------------------------------------# $Id = ; $Id = ; chomp ($Id); unless ($Id =~ /\[p2f\].*/) { die("Keine gültige Kontrolldatei"); } # Daten aus Kontrolldatei auslesen --------------------------------------------# while() { chomp; if (/^\[0102C10000\] +([0-9]+).*/) { $Liefernummer = $1; } if (/^\[0104290000\]/) { $Bestellnummer = substr ($_, 69, 5); } if (/^\[0103750000\]/) { $Anschrift1 = substr ($_, 12, 50); } if (/^\[0103B10000\]/) { $Anschrift2 = substr ($_, 12, 50); } if (/^\[0104290000\]/) { $Anschrift3 = substr ($_, 12, 50); } if (/^\[0104650000\]/) { $Anschrift4 = substr ($_, 12, 50); } if (/^\[0104A10000\]/) { last; } } close (CTL); # Lieferschein als PDF-Datei erzeugen -----------------------------------------# open my $fh, ">:raw", $PJLFile; print $fh "\x1b%-12345X\x0A" . "\x40PJL DEFAULT PDFMARK = \"[ " . "/Author (Meine Firma) " . "/Creator (print2forms) " . "/Keywords (Lieferschein, " . $Liefernummer . ") " . "/Title (Lieferschein " . $Liefernummer . ") " . "/DOCINFO pdfmark \""; close ($fh); my $Document = $Spool . "\\LI-" . $Liefernummer . ".pdf"; my $Cmd = "\"" . $Script . "\\gpcl6win64.exe\"" . " -dNOPAUSE" . " -sDEVICE=pdfwrite" . " -dPDFFitPage" . " -dPDFA=1" . " \"-sOutputFile=" . $Document . "\"" . " \"" . $PJLFile . "\"" . " \"" . $PCLFile . "\""; system ($Cmd); # Variablen für Schablonen vorbereiten ----------------------------------------# my $tt = Template->new (); my %params = (Anschrift1 => $Anschrift1, Anschrift2 => $Anschrift2, Anschrift3 => $Anschrift3, Anschrift4 => $Anschrift4, Bestellnummer => $Bestellnummer); $tt->process ('mail.html', \%params, \$mail_html); $tt->process ('mail.txt', \%params, \$mail_text); # E-Mail zusammenbauen aus Text, HTML und Anhang ------------------------------# my $Empfaenger = "spe\@spe-systemhaus.de"; my $msg = MIME::Lite->new(From => 'abc@spe-systemhaus.de', To => $Empfaenger, Subject => "Lieferschein $Liefernummer", Type => 'multipart/mixed'); # Innerer Rahmen als multipart/alternative ------------------------------------# my $alternative = $msg->attach (Type => 'multipart/alternative'); $alternative->attach (Type => 'text/plain', Data => $mail_text); $alternative->attach (Type => 'text/html', Data => $mail_html); $msg->attach (Type => 'application/pdf', Path => $Document, Filename => "Lieferschein $Liefernummer.pdf"); MIME::Lite->send('smtp', "mein.smtp.de", AuthUser=>'mein_benutzername', AuthPass=>'mein_passwort', SSL=>1, Port=>465, Debug=>0, Timeout=>60); $msg->send; unlink ($PCLFile); unlink ($CTLFile); unlink ($Document); exit 0; \\ ==== Das Ergebnis ==== Nutzt der Empfänger der E-Mail einen Mail-Client, der **nur Texte** anzeigt, sollte dann etwas ähnliches wie das hier zu sehen sein: ((Die Screenshots wurden vom Mail-Client **Thunderbird** erstellt.\\ \\ )) {{print2forms:tips:0090-2.png}} \\ \\ Erlaubt der Mail-Client die Anzeige von **%%HTML%%-Inhalten**, zeigt sich in etwa folgendes: {{print2forms:tips:0090-1.png}} \\ \\ Öffnet man die **angehängte %%PDF%%-Datei** und betrachtet deren Eigenschaften, sieht man, dass die von (p2f) erzeugten Meta-Daten auch korrekt eingebaut worden sind. {{print2forms:tips:0090-3.png}} \\ \\