Webseiten-Werkzeuge

Benutzer-Werkzeuge


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 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 convert4print-Gateway zum Einsatz kommen. Dieses erzeugt eine Datei mit einem PCL-Druckdatenstrom (Endung '.pcl') und eine zweite Datei (Endung '.ctl'), in der die gesamten im Druckdatenstrom vorgefundenen Texte aufgelistet sind. Die Dateinamen bestehen aus dem internen Objektbezeichner des Gateways und einer laufenden Nummer, die die Einmaligkeit der Namen garantiert. Die Dateien heissen dann beispielsweise '51933D75_53.PCL' und '51933D75_53.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.

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:

[c4p]
[Param]1.0;10.1.15.53;21.10.14 13:49:10

[Form]AUFTRAG
[0007D90169]2014000362
[0008240240]Auftragsnummer
[00013D0060]AUFTRAG
[0003140169]Kunde GmbH
[000140018C]   Firma :
[00031401E1]Hr. Mustermann
[0001400204]    Name :
[0003140259]Kundenstr. 13
[000140027C]  Straße :
[00031402D1]12346 Kundenstadt
[00014002F4] Plz/Ort :
[0003140349]54321 123456
[000140036C] Telefon :
[00031403C1]tm@kunde-gmbh.de
[00014003E4]  E-Mail :
[00067403C1]Kundenstadt
[00096803C1]20.10.2014
[00086C0420],den
[0000D404B6]Hiermit erteilen wir einen Auftrag zur Lieferung folgender Waren:
[0000EC059C]Pos.
[0001D0059C]Anz.
[000284059C]Bezeichnung
[0007F4059C]Einzelpr.
[000968059C]Gesamtpr.
[000188063C]1
[000218063C]10
[0002A8063C]Testgerät Typ TST-100
[00086C063C]100,00
[0009D4063C]1000,00
[00018806B4]1
[00021806B4]15
[0002A806B4]Testgerät Typ TST-50
[00089006B4]50,00
[0009F806B4]750,00
[0007DC0BDC]Endpreis
[0009D40BDC]1750,00
[0007DC0C18]ohne MWST
[0000D40C90]Liefertermin ca.:
[0000F80DFD]Verkäufer
[0008000DFD]Käufer
[Page]
[End]

Für die Beschaffung der Auftragsnummer muss beispielsweise in der Zeile mit dem Index '[0007D90169]' die zehn Ziffern nach dem Index ausgelesen werden. Die Anschrift des Kunden ist in den Zeilen mit den Indizes '[0003140169]', '[00031401E1]', '[0003140259]' und '[00031402D1]' 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.

pdfmail.pl
#!/usr/bin/perl
#
# Command line:    c:\perl\bin\perl.exe "%1\pdfmail.pl" "%2" "%4"
#
 
use MIME::Lite;
 
#------------------------------------------------------------------------------#
 
my $Spool  = $ARGV [0];
my $Name   = $ARGV [1];
 
exit 100 if ($Spool eq "" || $Name eq "");
 
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 gueltige Kontrolldatei pruefen #
 
$Id = <CTL>;
chomp ($Id);
unless ($Id =~ /\[c4p\].*/)
  {
    die("Keine gueltige Kontrolldatei");
  }
 
# Mit Hilfe der Positionsangaben die Auftragsnummer #
# aus der Kontrolldatei entnehmen #
 
my $Auftragsnummer;
my $Anschrift1;
my $Anschrift2;
my $Anschrift3;
my $Anschrift4;
 
while(<CTL>)
  {
    chomp;
 
    if (/^\[0007D90169\]([0-9]+).*/) { $Auftragsnummer = $1; }
 
    if (/^\[0003140169\]/) { $Anschrift1 = substr ($_, 12, 50); }
    if (/^\[00031401E1\]/) { $Anschrift2 = substr ($_, 12, 50); }
    if (/^\[0003140259\]/) { $Anschrift3 = substr ($_, 12, 50); }
    if (/^\[00031402D1\]/) { $Anschrift4 = substr ($_, 12, 50); }
    if (/^\[00014002F4\]/) { 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:Auftrag $Auftragsnummer",                 # title of PDF file #
        "-dAuthor:convert4print");                        # author of PDF file #
 
# Eine Nachricht mit zwei Teilen erzeugen #
 
$msg = MIME::Lite->new(From    =>"tm\@kunde-gmbh.de",
                       To      =>"tm\@spe-systemhaus.de",
                       Subject =>"Auftrag-" . $Auftragsnummer,
                       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 Auftrag $Auftragsnummer\n" .
                    "zur Lieferung von Testgeraeten.\n" .
                    "\n" .
                    "Mit freundlichen Gruessen\n" .
                    "Kunde GmbH\n" .
                    "\n" .
                    "Dieses Dokument wurde von convert4print erzeugt und ist\n" .
                    "ohne Unterschrift gueltig.\n" );
 
$msg->attach(Type     =>'document/pdf',
             Path     =>"$PDFFile",
             Filename =>"Auftrag-$Auftragsnummer.pdf" );
 
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 Auftrag 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:



Bemerkungen

  • Wird ein anderes Programm als LincPDF verwendet, ist lediglich der Programmaufruf im Skript entsprechend abzuändern.
convert4print/tips/tip27.txt · Zuletzt geändert: 2018-04-06 16:52 (Externe Bearbeitung)