===== Dokument via EMail versenden ===== ==== Anforderung ==== Um Prozesse im Zusammenhang mit dem Druck von Dokumenten zu optimieren und auch um Kosten zu senken, ergibt sich immer wieder die Anforderung, ein Dokument nicht zu drucken, sondern es in Form einer EMail zu versenden. Eine Herausforderung dabei ist zunächst die, aus den Druckdaten ein für den Empfänger der EMail lesbares Format zu erzeugen - vorzugsweise ein PDF-Dokument (siehe hierzu Tip [[print2forms:tips:tip30|PDF- oder TIFF-Dateien erzeugen]]). Anschliessend sollte noch, wenn möglich, ein personalisiertes Anschreiben als Text der EMail erzeugt werden. Die PDF-Datei wird als Anhang hinzugefügt. \\ \\ ==== Realisierung ==== Für die Realisation muss ein (p2f)-Gateway zum Einsatz kommen. Dieses erzeugt eine Datei (Endung '.pcl') mit einem Druckdatenstrom analog zu dem von einem Client produzierten Drukdatenstrom und eine zweite Datei (Endung '.ctl'), in der die gesamten im Druckdatenstrom vorgefundenen Texte aufgelistet sind (identisch mit der, die ein Client bei entsprechender Konfiguration auch erzeugt). Die Dateinamen bestehen aus dem internen Objektbezeichner des Gateways und einer laufenden Nummer, die die Einmaligkeit der Namen garantiert. Die Dateien heissen dann beispielsweise 'B6TL4J8_536.PCL' und 'B6TL4J8_536.CTL'. Nachdem das Gateway beide Dateien erstellt hat, führt es jedesmal das in seiner Konfiguration unter **Befehlszeile** angegebene Kommando zum Start eines Programms oder Skriptes aus, sobald ein eventuell bereits vorangegangenes Kommando mit seiner Bearbeitung fertig geworden ist. Damit ist sichergestellt, dass die Bearbeitung der Dateien durch das Gateway sequenziell erfolgt, und damit keine Parallelität entsteht. Das ist ein wichtiger Aspekt, wenn die gestarteten Programme oder Skripte ihrerseits Dateien erzeugen. Ein mögliches Skript für das Versenden von Dokumenten via EMail soll im folgenden kurz vorgestellt werden. Es basiert auf der einfachen Lieferscheinanwendung aus der Demo-Version von (p2f). Die erste Aufgabe des Skriptes ist es, die für das Versenden selbst und die für das Anschreiben notwendigen Daten aus der .CTL-Datei zu besorgen. Die zu beschaffenden Daten werden über den Index (die Zahl in eckigen Klammern) identifiziert. Das Skript liest also die Datei bis es an den gewünschten Index kommt und liest dann die gedruckten Texte aus. Hier ein kurzer Auszug aus einer solchen Indexdatei: [p2f]134676739 [Gateway]3.1.0.3039;B6TL4J8.XML [Param]3.0;10.1.17.27 [Time]05.07.13 14:39:21 [Computer]THINKCENTRE3 [User]Volker [Model]p2f Gateway [Job]Sample 1 [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] 05.07.2013 [0106810000] 1 L1BL50 Schaltlitze 0,14x50 m blau St 330 0 330 [0106F90000] 2 L1SW500 Schaltlitze 0,14x500 m schw. St 50 0 50 [0107710000] 3 2L1002P Kabelset PS/2 2,0 m St 210 21 189 [Page] [End] Für die Beschaffung der Bestellnummer müssen beispielsweise in der Zeile mit dem Index '[0104290000]' die fünf Ziffern ab der Spalte 69 ausgelesen werden. Die Anschrift des Kunden ist in den Zeilen mit den Indizes '[0103750000]', '[0103B10000]', '[0104290000]' und '[0104650000]' jeweils ab Spalte 12 (nach dem Index) zu finden, usw. Anschliessend konvertiert das Skript die vom Gateway erzeugte .PCL-Datei in ein PDF-Dokument, um dieses PDF-Dokument dann als Anhang einer EMail zu verwenden. Die EMail selbst wird mit dem Perl-Package 'MIME::Lite' erzeugt, welches natürlich installiert worden sein muss. #!/usr/bin/perl # # Command: perl email.pl "%1" "%2" "%4" # # Call: perl email.pl Scriptpath Spoolpath Filename # use MIME::Lite; #------------------------------------------------------------------------------# # Params: Scriptpfad Spoolpfad Dateiname my $Script = $ARGV [0]; my $Spool = $ARGV [1]; my $Name = $ARGV [2]; my $PCLFile = $Spool . "\\" . $Name . ".pcl"; my $CTLFile = $Spool . "\\" . $Name . ".ctl"; my $PDFFile = $Spool . "\\" . $Name . ".pdf"; 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"); } # Mit Hilfe der Positionsangaben Anschrift und # # Bestellnummer aus der Kontrolldatei entnehmen # $count = 0; 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; } } system ("C:\\Programme\\Lincoln\\Bin\\LincPDFc", "-i$PCLFile", # path and name of input PCL file # "-o$PDFFile", # path and name of output PDF file # "-k:5", # blend mode # "-r:2", # ANSI character encoding # "-n:1.0", # constant alpha of 1.0 # "-q1", # replace patterns with fill # "-pType:1", # paper size A4 # "-dTitle:Lieferschein $Liefernummer", # title of PDF file # "-dAuthor:print2forms"); # author of PDF file # # Eine Nachricht mit zwei Teilen erzeugen # $msg = MIME::Lite->new(From =>"versand\@spe-systemhaus.de", To =>"spe\@spe-systemhaus.de", Subject =>"Ihre Bestellung Nummer " . $Bestellnummer, Type =>'multipart/mixed' ); $msg->attach(Type =>'TEXT', Data =>"An\n" . "$Anschrift1\n" . "$Anschrift2\n" . "$Anschrift3\n" . "$Anschrift4\n" . "\n" . "Als Anhang senden wir Ihnen den Lieferschein $Liefernummer\n" . "zur Bestellung $Bestellnummer\n" . "\n" . "Mit freundlichen Grüßen\n" . "Kabel GmbH\n" . "\n" . "Dieses Dokument wurde von print2forms erzeugt und ist\n" . "ohne Unterschrift gültig.\n" ); $msg->attach(Type =>'document/pdf', Path =>"$PDFFile", Filename =>"Lieferschein-$Liefernummer.pdf" ); $text = $msg->as_string; MIME::Lite->send('smtp', "10.1.1.9", Timeout=>60); $msg->send; close (CTL); unlink ($PCLFile); unlink ($CTLFile); unlink ($PDFFile); exit 0; Die Angaben für den Versand der EMail sind hier konstant gehalten. In einer realen Applikation würden diese Daten entweder aus dem Druckdokument selbst entnommen, oder über einen Datenbankzugriff beschaft. Für einen Test in ihrer Installation müssen hier natürlich die Domains angepasst werden. Das Anschreiben der eigentlichen EMail ist einfach gehalten. Es handelt sich um eine reine Textnachricht. Hier werden die vorher ermittelten Daten aus dem Lieferschein eingesetzt. Nachdem das PDF-Dokument angehängt worden ist, kann die EMail an den SMTP-Server übergeben werden. Auch hier muss die IP-Adresse entsprechend den aktuellen Gegebenheiten angepasst werden. Als letztes löscht das Skript alle beteiligten Dateien. Beim Empfänger der EMail sollte dann etwas ähnliches wie das hier zu sehen sein: {{print2forms:tips:0027-1.png}} \\ \\ ==== Bemerkungen ==== * Wird ein anderes Programm als **LincPDF** verwendet, ist lediglich der Programmaufruf im Skript entsprechend abzuändern.