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}}
\\
\\