Kategorien
Allgemein SAP

SAP Fax – Standard Installation

Ein SAP Netweaver System kann über viele Wege mit ihren Nutzern oder Kunden kommunizieren. Im Standard vorgesehen ist EMail, SMS und das Fax – über die Schnittstellen ist jede Art der Kommunikation möglich. Wenn wir beim Thema Fernkopierer sind: Ja, auch TELEX und das Morsen ist realisierbar.

SAPConnect (c) SAP
SAPConnect
(c) SAP

Der Weg über den FAX Provider ist der kleverste. Der Postfix Mailserver ist in der Regel bereits vorhanden und kann auch von anderen Anwendungen genutzt werden.

Der SAP Netweaver ist schnell vorbereitet. (Link) Man ist gut beraten, eine eigene, extern erreichbare Maildomain zu konfigurieren. Das SAP System produziert also nicht mehr als eine EMail, welche mit einer eigenen Domain versehen an den Mailserver transportiert wird. Über die Transaktion SBWP geben wird lediglich die Faxnummer ein, das Mailformat sieht dann so aus: FAX=+49105954900@fax-provider.com. Der Präfix FAX= wird zwingend automatisch hinzugefügt. Genau so die Ländervorwahl +49 für „DE“ Deutschland und der Suffix, die Domain. Ein Fax kann und soll auch von anderen Applikationen versendet werden können. Sehen wir uns die verschiedenen „To:“ Zeilen im Header der Mails an um heraus zu finden, wie man letztendlich die Faxnummer heraus filtern kann.

To: "DE 22023480" <FAX=+4922023480@FAX.SYSTEM.DE>

So sendet das SAP System. Andere Systeme sehen so aus:

To: 0223480@fax.system.de
To: "022023480@fax.system.de" <022023480@fax.system.de>

Thunderbird sendet wie in Zeile 1 und Microsoft Outlook wie in Zeile 2. Für die Filterung der Faxnummer aus dem Mail Header existiert ein gutes Script von Lee Howard (Hylafax) welches die üblichen Fälle abdeckt. Für die Besonderheiten des SAP Systems müssen wir es modifizieren.

#!/bin/sh
# Script von Lee Howard
# customized 2018
# thomas@schilling-bontkirchen.de
RANDOMFAX=/tmp/mail2fax.$$
mkdir $RANDOMFAX
cat >> $RANDOMFAX/_message_
# Debug setting
#set -x
#exec > /tmp/mail2fax.log 2>&1
JOBID=`grep -e "^subject:" -i $RANDOMFAX/_message_ | sed q | sed 's/^[^:]*: *//g'`
TOLINE=`grep -e "^to:" -i $RANDOMFAX/_message_ | sed q`
FROMLINE=`grep -e "^from:" -i $RANDOMFAX/_message_ | sed q`
if [ "`echo $TOLINE | grep '<.*>'`" != "" ]; then
TONUMBER=`echo $TOLINE| sed -e 's/.*<\(.*[^@]*\)@.*>.*/\1/'`
else
TONUMBER=`echo $TOLINE| sed -e 's/^[Tt]o://g' -e 's/[ ]*\(.*[^@]*\)@.*/\1/'`
fi
if [ "`echo $TONUMBER | grep 'FAX='`" != "" ]; then
TO=`echo $TONUMBER| tr -d 'FAX='`
TONUMBER=$TO
fi
if [ "`echo $FROMLINE | grep '<.*>'`" != "" ]; then
FROMPATH=`echo $FROMLINE| sed -e 's/.*<\(.*\).*>.*/\1/'`
else
FROMPATH=`echo $FROMLINE| sed -e 's/^[Ff]rom://g' -e 's/[ ]*\([^ ]*\).*/\1/'`
fi
cat $RANDOMFAX/_message_ | faxmail -v -T $FROMPATH | sendfax -vv -n -D -f "$FROMPATH" -i "$JOBID" -d $TONUMBER
rm -rf $RANDOMFAX
exit 0

In den Zeilen 19 bis 22 korrigieren wir die Faxnummer die vom SAP System mit einer quasi Dienstkennung (FAX= oder SMS=) versendet wird. Schauen wir uns den Debug an:

+ grep -e ^subject: -i /tmp/mail2fax.24145/_message_
+ sed s/^[^:]*: *//g
+ sed q
+ JOBID=Test
+ grep -e ^to: -i /tmp/mail2fax.24145/_message_
+ sed q
+ TOLINE=To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ grep -e ^from: -i /tmp/mail2fax.24145/_message_
+ sed q
+ FROMLINE=From: "Thomas Schilling" <schillingt@sap.system.de>
+ echo To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ grep <.*>
+ [ To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE> != ]
+ echo To: "DE 123456789" <FAX=+49123456789@FAX.SYSTEM.DE>
+ sed -e s/.*<\(.*[^@]*\)@.*>.*/\1/
+ TONUMBER=FAX=+49123456789
+ echo FAX=+49123456789
+ grep FAX=
+ [ FAX=+49123456789 != ]
+ echo FAX=+49123456789
+ tr -d FAX=
+ TO=+49123456789
+ TONUMBER=+49123456789
+ echo From: "Thomas Schilling" <schillingt@sap.system.de>
+ grep <.*>
+ [ From: "Thomas Schilling" <schillingt@sap.system.de> != ]
+ echo From: "Thomas Schilling" <schillingt@sap.system.de>
+ sed -e s/.*<\(.*\).*>.*/\1/
+ FROMPATH=schillingt@sap.system.de
+ rm -rf /tmp/mail2fax.24145
+ exit 0

Wir sehen, das in Zeile 19 If   WAHR ist und FAX= durch tr(im) heraus geschnitten wird. Faxmails können jetzt von jedem Programm in jedem Format zum Faxserver zur Verarbeitung weiter geleitet werden. Im Postfix bedienen wir uns in der main.cf der virtual_alias_maps die folgenden Inhalt hat

@fax.system.de sapfax

Wir leiten alle Mails an die Domain fax.system.de an den Alias sapfax weiter. Sapfax ist wiederum in der /etc/aliases definiert.

sapfax: | /usr/local/bin/sapfax.sh

Der Systemuser-Alias „sapfax“ wird durch eine Pipe an unser Script, das global ausführbar sein muss, weiter geleitet und verarbeitet.

Ein hervorragendes Manual für die Installation von Asterisk und Hylafax ist noch zu nennen (Link) – alles weitere ist problemlos.

Kategorien
Allgemein

PDF und FAX Handling

PDF / FAX Verarbeitung

Druckaufträge in HYLAFAX verarbeiten

Systeme im Rechnungswesen produzieren Unmengen an Dokumenten die automatisch in Document Management Systemen archiviert oder weiter verarbeitet werden. Im Idealfall produziert das System Textdateien und legt sie im Dateisystem ab – hier kann je nach Belegart eine entsprechende Verarbeitung statt finden.

Ist im Anwendungsprogramm das versenden von Belegen als eMail oder FAX nicht vorgesehen, kann diese Funktionalität schnell realisiert werden. Für die Generierung von Faxen, kann zum Beispiel im Druckdokument ein Steuerzeichen angelegt werden. In meinem speziellen Fall fügte ich ein @@NUMMER ein – zu empfehlen ist grundsätzlich, einen Marker zu verwenden, der im gewöhnlichen Sprachgebrauch nicht vorkommt. Aus dem Dokument ist die Faxnummer einfach mit

NUM=$(grep '^@@NUMMER' $x |tr -d '@NUMMER '|tr -d ')

heraus zu filtern. Grep filtert die Zeile mit dem Marker aus dem Dokument, tr(im) löscht den Marker aus der Zeile und übergibt die Faxnummer, direkt hinter dem Marker, an die Variable NUM.

Grundsätzlich könnte das Dokument jetzt an die Nummer versendet werden. Wenn aber im 21ten Jahrhundert noch solch eine antiquierte Technik verwendet wird, dann aber mit einem Logo auf dem Dokument und einer Quittung als PDF. Es ist nicht schwierig, aus der Textdatei eine PDF zu fertigen, es hängt aber von den Versionen der verschiedenen Programme ab sowie der Standardblattgröße des Systems. Das Postscript verwende ich als Zwischenformat da hier Änderung am Layout recht einfach durch einfügen einiger Steuerzeichen möglich ist:

echo -e "\000epsf[s0.95 x-3 y0a nx ny]{logo.eps}" > fax.tmp
# Einfuegen des Logos
echo -e "\000font{Arial@6}" >> fax.tmp
# Aendern der Schriftart und Groesse
echo -e "       HylaFax Server by HALSYSTEM" >> fax.tmp
# Kopfzeile
echo -e "\000font{Courier@11}" >> fax.tmp
# Schriftart und Groesse des Dokumentes

Etwas Arbeit verursacht das einsetzen des EPS Logos. Es muss die exakte Position ermittelt und angegeben werden. In meinem Fall wird das Logo mit dem Faktor 0.95 angezeigt und um 3 Spalten nach links, in absoluter Position gesetzt. Aus der Textdatei wird mit Hilfe des Programms enscript eine Postscript Datei erzeugt.

enscript -e -B -pfax.ps fax.pr
# aus Text wird Postscript
ps2pdf fax.ps $x.pdf
# aus Postscript wird PDF

Das PDF kann an dieser Stelle beliebig verarbeitet werden z.B. Ablage in ein DMS System oder Versandt per eMail. Da ich mit der Formulargröße stets Probleme hatte, konvertiere ich vor dem versenden zurück in Postscript mit dem Parameter „DIN A4“.

acroread -toPostScript -size a4 fax.pdf
# PDF als DIN A4 Postscript
sendfax -T 3 -f $MAIL -n -d $NUM fax.ps
# versenden des Telefaxes

 

Wer möchte, kann kopieren und an sein System bzw. Bedürfnisse anpassen.

#!/bin/bash

# FAX Handling Script
# Thomas Schilling # HALSYSTEM.de
# NEUTRASOFT / AS400

LISTE=*.FAX
for x in $LISTE
do
echo -e "\000epsf[s0.95 x-3 y0a nx ny]{logo.eps}" > fax.tmp
echo -e "\000font{Arial@6}" >> fax.tmp
echo -e "       HylaFax Server by HALSYSTEM" >> fax.tmp
echo -e "\000font{Courier@11}" >> fax.tmp

NUM=$(grep '^@@NUMMER' $x |tr -d '@NUMMER '|tr -d ' ')
if [ -z $NUM ] ; then
LISTE=/var/spool/hylafax/log/c*
for x in $LISTE; do
mv -f $x $x.doc
cp -f $x.doc /tmp/b2/Fax/Quittung/
mv -f $x.doc /home/tsp/trash/
done
else
echo -e "" >> fax.tmp
sed '1,5d' $x >> fax.tmp
cat fax.tmp|sed -e '1,$s/@@FRM 0/LOGO/g' > fax.pre
cat fax.pre|perl -p -i -e 's/LOGO/\000epsf[s0.95 x-3 y0a nx ny]{logo.eps}/g;' > fax.pr
enscript -e -B -pfax.ps fax.pr
cat fax.ps|perl -p -i -e 's/\224/oe/g;' > fax.um
cat fax.um|perl -p -i -e 's/\204/ae/g;' > fax.ps
cat fax.ps|perl -p -i -e 's/\201/ue/g;' > fax.um
cat fax.um|perl -p -i -e 's/\232/Ue/g;' > fax.ps
cat fax.ps|perl -p -i -e 's/\341/ss/g;' > fax.um
cat fax.um > fax.ps
ps2pdf fax.ps $x.pdf
cp -f $x.pdf /tmp/b2/FAX/gesendet/
cp -f $x.pdf fax.pdf
acroread -toPostScript -size a4 fax.pdf
chmod 0777 *
if [ $NUM = "00" ] ; then
cp $x.pdf /tmp/b2/PDF/
else
case "$x" in
MBA*) MAIL=mba@b1.bub;;
*) MAIL=mk@b1.bub;;
esac
sendfax -T 3 -f $MAIL -n -d $NUM fax.ps
fi
mv $x /home/tsp/trash/
fi
done
LISTE=/var/spool/hylafax/recvq/*.tif
for x in $LISTE; do
tiff2pdf -o$x.pdf $x
mv -f $x /home/tsp/trash/
cp -f $x.pdf /tmp/b2/Fax/empfangen/
mv -f $x.pdf /home/tsp/trash/
mv -f /home/vera/*.pdf /home/tsp/trash/
done