Rufauswertung wenn ausgehender Ruf nicht erfolgreich

konabi

Mitglied
Mitglied seit
11 Apr 2005
Beiträge
424
Punkte für Reaktionen
0
Punkte
16
Hallo,

ich habe nun Erfolgreich den Asterisk dazu gebracht Emails per FAX zu versenden. ( http://wpkg.org/email2fax/index.php )
Das Script wird mit einer Email gefüttert und erwartet eine Rufnummer im Betreff Feld, sowie eine PDF pder TIFF Datei im Anhang.
Ist beides vorhanden, wird ein call über Asterisk erzeugt und der Sender bekommt eine Bestätigungsmail FAX erfolgreich versendet.

ABER....
wenn Asterisk nun das FAX nicht versenden kann weil beispielsweise die FAX Rufnummer ungültig oder das FAX Gerät besetzt war wird der Sender nicht benachrichtigt.
Also suche ich nach einer Möglichkeit den Ruf von Asterisk auszuwerten.
Erfolgreich oder nicht Erfolgreich.


Im Falle eines Misserfolg müsste dann ein SCRIPT ausgeführt werden, welches eine E-MAIL an den Sender generiert.


Hat da jemand eine Idee wie ich eine Auswertung bekomme Ruf Erfolgreich oder Nicht Erfolgreich?


Auf Wunsch kann ich auch eine Anleitung posten wie ich email2fax eingerichtet habe.


Gruß Sven
 
Genau das ist der richtige Ansatzpunkt.

Aber vieleicht kannst Du mir noch mal auf die Sprünge helfen.

Das Script erzeugt ein Callfile und kopiert es nach /var/spool/asterisk/outgoing

Das Callfile sieht folgendermaßen aus:

Code:
Channel: CAPI/contr1/25
MaxRetries: 1
WaitTime: 20
Application: txfax
Data: /tmp/email2fax/1133447586-251216000/datei.pdf.tif|caller


Jetzt müsste ich ein Macro basteln welches nur verwendet wird wenn
ein Ruf durch dieses CallFile erzeugt wird.


Wie könnte das gehen?

Danke Sven
 
Ich habe nun das call File etwas verändert:

Code:
Channel: CAPI/contr1/25
MaxRetries: 0
WaitTime: 20
Context: outgoing-fax
Extension: sendfax
Priority:1
SetVar: FAXFILE=/tmp/email2fax/1133447586-251216000/install.tif

und meine extensions.conf angepasst:

Code:
[outgoing-fax]
exten => sendfax,1,txfax(${FAXFILE}|caller)
exten => sendfax,n,Goto(s-${DIALSTATUS},1)

exten => s-ANSWER,1,Dial(SIP/510)
exten => s-NOANSWER,1,Dial(SIP/510)
exten => s-CANCEL,1,Dial(SIP/510)
exten => s-BUSY,1,Dial(SIP/510)
exten => s-CHANUNAVAIL,1,Dial(SIP/510)
exten => s-CONGESTION,1,Dial(SIP/510)
exten => _s-.,1,Dial(SIP/510)

Testweise wird erst einmal der SIP Teilnehmer SIP/510 angerufen.
Leider habe ich das Problem dass die Variable ${DIALSTATUS} immer leer bleibt.


Asterisk CLI:

Code:
*CLI>     -- Saved useragent "PA168S" for peer 510
    -- Attempting call on CAPI/contr1/25 for sendfax@outgoing-fax:1 (Retry 1)
Dec  2 12:42:22 NOTICE[7474]: channel.c:2406 __ast_request_and_dial: Don't know what to do with control frame 15
  == ISDN1: Setting up DTMF detector (PLCI=0x101, flag=1)
       > Channel CAPI/ISDN1/25-0 was answered.
    -- Executing TxFAX("CAPI/ISDN1/25-0", "/tmp/email2fax/1133447586-251216000/install.tif|caller") in new stack
    -- Executing Goto("CAPI/ISDN1/25-0", "s-|1") in new stack
    -- Goto (outgoing-fax,s-,1)
    -- Executing Dial("CAPI/ISDN1/25-0", "SIP/510") in new stack
    -- Called 510
    -- SIP/510-6401 is ringing
    -- SIP/510-6401 answered CAPI/ISDN1/25-0
  == Spawn extension (outgoing-fax, s-, 1) exited non-zero on 'CAPI/ISDN1/25-0'
  == ISDN1: CAPI Hangingup
Dec  2 12:43:11 NOTICE[7474]: pbx_spool.c:276 attempt_thread: Call completed to CAPI/contr1/25
       > CAPI INFO 0x3490: Normal call clearing


Kann mir da jemand weiterhelfen?


Danke Sven
 
Dialstatus und txfax

Ich habe jetzt noch mal auf www.voip-info.org gesucht.
Könnte es sein dass man ${DIALSTATUS} nicht mit der Anwendung txfax verwenden kann sondern nur mit dem DIAL Befehl?


Gruß Sven
 
ich weiß nicht, wie txfax arbeitet
Aber die Variable steht nur nach einem Dial() Befehl zur Verfügung.
 
Auf Wunsch kann ich auch eine Anleitung posten wie ich email2fax eingerichtet habe.

Das waere in der tat hoechst loeblich!

Lippenleckend
Chris
 
Damit das ganze Vollständig ist zwei Kapitel Fax empfangen und Fax versenden aus dem Buch Asterisk Kompakt (BETA)
Ein Feedback wäre gut um Unklarheiten noch zu verbessern.


Ein Fax mit Asterisk entgegennehmen

Ist der Asterisk mit einer ISDN Karte ausgestattet, so kann man ihn auch dazu bewegen Faxe entgegenzunehmen oder zu versenden. Dazu benötigt Asterisk zwei weitere Anwendungen, app_rxfax und app_txfax, welche sich in der Bibliothek spandsp befinden. Spandsp ist eine Bibliothek für Digital Signal Processing kurz DSP. Mit Hilfe von DSP kann man Bilder in Töne konvertieren und umgekehrt und somit auch Faxe empfangen (Ton zu Bild) oder versenden (Bild zu Ton).

Erhältlich ist spandsp auf folgender Webseite: http://soft-switch.org/downloads/spandsp/
Dort existieren verschieden Versionen von spandsp. Für die Asterisk Version 1.2 kann das Packet spandsp-0.0.2pre21c verwendet werden. Neben der benötigten Bibliothek spandsp gibt es ein weiteres Verzeichnis asterisk-1.2.x aus welchem die Programme app_rxfax und app_txfax heruntergeladen werden müssen, sowie das dazugehörige Patchfile apps_makefile.patch.

Bevor man mit dem kompilieren beginnen kann muß noch sichergestellt werden dass folgende Packete installiert sind:

libtiff, libtiff-devel
libjpeg, libjpeg-devel
libxml2, libxml2-devel
libstdc++, libstdc++-devel

Das Packet spandsp wird in das Verzeichnis /usr/src entpackt und mit folgenden Befehlen compiliert:

./configure
make
make install

Installieret wird spandsp in folgende Verzeichnisse:

/usr/local/include
/usr/local/lib
/usr/local/share

Die beiden Anwendungen app_rxfax.c und app_txfax.c sowie das Patchfile apps_makefile.patch werden in das Anwendungsverzeichnis der Asteriskquellen. /usr/src/asterisk-version/apps/ kopiert. Anschließend muß noch das Makefile in diesem Verzeichnis mit folgendem Befehl gepatcht werden:

patch < apps_makefile.patch

Zum Schluß werden noch die Asterisk Quellen neu kompiliert, indem man in das Verzeichnis /usr/src/asterisk-version wechselt und die bekannten Befehle ausführt:

make clean
make
make install

Der Befehl make samples sollte diesmal nicht ausgeführt werden, da sonst die Asterisk Konfigurationsdateien im Verzeichnis /etc/asterisk überschrieben werden.
Nach erfolgreicher Installation befinden sich die beiden Programme app_rxfax.so und app_tx_fax.so im Modulverzeichnis /usr/lib/asterisk/modules.

Asterisk soll so konfiguriert werden, dass Faxe auf der internen Rufnummer 52 entgegengenommen werden. Diese sollen dann per E-Mail Anhang als PDF Datei an eine zentrale Adresse fax@domain weitergeleitet werden.

Da die ankommenden Faxe von der Anwendung rxfax in eine tiff Datei geschrieben werden, müssen wir noch das Programm tiff2pdf installieren welches sich in dem Packet tiff befindet und in der Lage ist Bilddateien des Formates TIFF in PDF Dateien umzuwandeln.

Die Konvertierung der Bilddatei in das PDF Format, sowie die Zustellung per E-MAIL an den lokalen MTA (Mail Transport Agent) erfolgt mit Hilfe des bash Scriptes fax2mail. Gegebenfalls muß der MTA für die Weiterleitung der E-Mail an den zuständigen Mailserver des Benutzers der die Mail empfangen soll eingerichtet werden. Im Fall von Postfix geschieht dies in der der Datei /etc/postfix/main.cf mit Hilfe des Eintrages relayhost= mailserver.


Gefunden habe ich das Skript in ähnlicher Form auf der Webseite http://www.voip-info.org und etwas modifiziert. Die Hauptidee des Skriptes stammt von Scott Laird: http://scottstuff.net/scott/archives/000152.html.

fax2mail:
Code:
#!/bin/sh#
# $1 ${CALLERIDNUM}
# $2 ${MAILADDRE}
# $3 ${FAXFILE}
#echo Received paramters $1 $2 $3  >>/var/log/faxmail.log
MAILBODY=$3.txtDATETIME=`date +"%A %d %b %Y %H:%M"`
PAGES=$(tiffinfo $3 | tail -21 |grep "Page" | cut -d "-" -f2)
DT=$(tiffinfo $3 | tail -21 |grep "Date" |cut -d "-" -f2)
DTFAX=${DT#*:}
COUNT=${PAGES#*-}
rm -f $MAILBODY
tiff2pdf $3 -o $3.pdf
echo >> $MAILBODY
echo ------------------------------------------------------------- >> $MAILBODY
echo Sie haben ein neues Fax bekommen. >> $MAILBODY
echo >> $MAILBODYecho Sendenummer: $1 >> $MAILBODY
echo Empfangszeit: $DTFAX >> $MAILBODY
echo Anzahl der Seiten: $COUNT >> $MAILBODY
echo >> $MAILBODY
echo Das Fax befindet sich im Anhang als PDF Datei. >> $MAILBODY
echo ------------------------------------------------------------- >> $MAILBODY
echo >> $MAILBODY
echo Thank you for using Open Source Software ! >> $MAILBODY
cat $3.txt | mail -r "Asterisk" -s "FAXEINGANG" -a "$3.pdf" $2
rm -f $MAILBODY


Das Script wird in ein passendes Verzeichnis auf den Asterisk Server kopiert und muß für den Asterisk Nutzer unter dem der Asterisk Server läuft die Rechte ausführen besitzen. In meiner Konfiguration befindet sich das Script im Verzeichnis /var/lib/asterisk/scripts.

Damit Faxe entgegen genommen werden können muß in der capi.conf die Rufnummer 52 für ankommende Rufe aktiviert sein. Der Rufnummernplan wird um ein Macro namens „faxempfang“ und einem Kontext für ankommende Faxe erweitert:

Code:
[macro-faxempfang]
exten => s,1,SetVar(SCRIPTFILE=/var/lib/asterisk/scripts/fax2mail)
exten => s,n,SetVar(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
exten => s,n,SetVar(MAILADDR=fax@domain)

[incoming_fax]
exten => 52,1,Wait(3)
exten => 52,n,Macro(faxempfang)
exten => 52,n,rxfax(${FAXFILE})
exten => 52,n,system("${SCRIPTFILE}" "${CALLERIDNUM}" "${MAILADDR}" "${FAXFILE}")
exten => 52,n,Hangup



Im Marco faxempfang werden folgende die Variablen gesetzt:

SCRIPTFILE
Das Script welches das ankommende Fax in eine PDF Datei umwandelt und anschließend die PDF Datei als E-Mailanhang versendet.

FAXFILE
Der Speicherort des ankommenden Faxes. Mit Hilfe der Variablen ${UNIQUEID} wird dafür gesorgt dass jedes ankommende fax einen eindeutigen Dateinamen in Form einer Zahl erhält.

MAILADDR
Die E-Mailadresse an der das FAX gesendet werden soll.


[incoming_fax]
exten => 52,1,Wait(3)
Im Kontext [incomming_fax] wird nun bei einem ankommenden FAX auf der Rufnummer 52 als erstes für 3 Sekunden gewartet.

exten => 52,n,Macro(faxempfang)
Danach wird das Macro Faxempfang aufgerufen.

exten => 52,n,rxfax(${FAXFILE})
Im dritten Schritt nimmt die Anwendung rxfax das Fax entgegen und erstellt eine tif Datei im Verzeichnis /var/spool/asterisk/fax

exten => 52,n,system("${SCRIPTFILE}" "${CALLERIDNUM}" "${MAILADDR}" "${FAXFILE}")
Mit Hilfe des Befehls system wird auf der Linux Shell das Script fax2mail (${SCRIPTFILE}) ausgeführt. Dem Scriptfile werden dabei die Parameter die CallerID des Sendenten (${CALLERIDNUM}), E-Mailadresse des Empfängers "(${MAILADDR) sowie das empfangene Faxdokument (${FAXFILE}) übergeben.

Asterisk ist nun bereit Faxe entgegen zu nehmen.


Ein Fax versenden

Nachdem Asterisk nun Faxe annehmen, und als E-Mail an Benutzer weiterleiteten kann wollen wir nun den entgegengesetzten Weg probieren. Wieder kommt uns ein kleines Linux Script namens email2fax zur Hilfe. Email2fax wurde von Tomasz Chmielewsky geschrieben und bietet die Möglichkeit TIFF und PDF Dokumente per E-Mail als Fax zu versenden.
Dazu wird eine E-Mail mit der zu sendeten Datei als Anhang an den Asterisk Server gesendet und in der Betreffzeile die entprechende Rufnummer angegeben. Das Script wertet diese Informationen aus konvertiert den Anhang und übergibt das ganze an Asterisk, welcher dann ein Fax an die entsprechende Rufnummer mit Hilfe der Anwendung app_txfax.c sendet.

Email2Fax kann auf der Webseite http://wpkg.org/email2fax/index.php heruntergeladen werden und ist unter der GPL Lizenz veröffentlicht. Für das Versenden kommt wieder die Bibliothek spandsp, sowie die schon besprochene Asterisk Anwendung app_txfax.c zum Einsatz.
Außerdem müssen das Packet munpack installiert sein, welches in der Lage ist MIME Nachrichten zu decodieren. Munpack befindet sich im Packet mpack , welches leider nicht in jeder Distribution enthalten ist. In diesem Fall kann man versuchen die im Packet email2fax mitgelieferten Programme mpack und mupack zu verwenden. Sollte dies fehlschlagen, sucht man sich am besten ein passendes rpm Packet über http:/fr2.rpmfind.net.
Als letztes muß noch sichergestellt werden dass die Packete libtiff sowie Ghostscript installiert sind. Ghostscript sollte dabei in einer Version >= 8 vorliegen.

Nach dem Download von email2fax in das Verzeichnis /usr/src/ wird dieses mit Hilfe von tar entpackt:

# cd usr/src
# tar –xvjf email2fax-version

Anschließend wird die in dem Archiv befindliche ausführbare Datei email2fax in das Verzeichnis /usr/local/bin kopiert:

# cp /usr/src/email2fax-version/ /usr/local/bin

Im Verzeichnis bin des Archivs befinden sich außerdem die beiden Programme mpack und munpack, welche nach /usr/bin/ kopiert werden:

# cp /usr/src/email2fax-version/usr/bin/m* /usr/bin


In dem Script email2fax müssen nun noch ein paar Variablen angepasst werden:

FAXMAIL=Asterisk FAX <[email protected]>
Nach dem versenden eines Faxes durch Asterisk oder bei Problemen erhält der der Sender eine E-Mail welche als Absender diesen Namen enthält.

CHANNEL="CAPI/contr1"
Über welchen Channel das Fax versendet wird.

LOGFILE=/var/log/asterisk/faxlog
In dieser Datei wird der Fax Versand protokolliert.

TMPDIR=/tmp/email2fax
In diesem Verzeichnis wird die E-Mail entpackt.

MAXAGE=300
Zeit in Minuten wie lange die Dateien in TEMPDIR aufbewahrt werden.

ASTERISKUSER=asterisk
Hier muß der Nutzer angegeben werden unter welchem der Asterisk Dienst läuft.


Bevor wir email2fax in Verbindung mit Asterisk nutzen, sollten wir auf der Linux Shell prüfen ob unsere Installation erfolgreich und alle Einstellungen richtig sind.
Dazu erzeugt man am besten eine E-Mail mit einer PDF- oder TIF-Datei im Anhang und einer gültigen Fax Rufnummer im Betreff, welche als eml Datei abgespeichert wird. Für Windows Benutzer ist es dabei wichtig diese Datei mit dem Zeilenumbruchformat für UNIX zu speichern. Ich hatte das nicht beachtet und lange lange lange… nach dem Fehler gesucht.

Diese Datei wird dann auf den Asterisk Server kopiert und über die Linux Shell durch folgenden Befehl an Asterisk übergeben:

# cat mail.eml | sudo –u asteriskuser email2fax –-debug

Läuft alles glatt, haben Sie nun Ihr erstes Fax über Asterisk versendet. Bei Problemen hilft ein Blick in das Logfile:

# tail –f /var/log/asterisk/faxlog


Als nächstes muß noch der auf dem Asterisk Server laufende MTA (Mail Transfer Agent) eingerichtet werden um die entsprechenden E-Mails entgegenzunehmen um sie anschließend an das Script email2fax zu übergeben.

Im folgenden Beispiel verwende ich Postfix als MTA. E-Mails die als Fax über Asterisk versendet werden sollen werden an die Adresse [email protected]l geschickt. Um diese an das Scrip tzu übergeben eignet sich beispielsweise der lokale Mailer Procmail.

Damit Procmail von Postfix Beachtung findet muß in der Datei /etc/postfix/main.cf folgender Eintrag vorgenommen werden:


mailbox_comand = /usr/bin/procmail


Möchte man Procmail global verwenden erstellt man im Verzeichnis /etc/ die Datei procmailrc mit entsprechenden Rechten für den Benutzer root:

# touch /etc/procmailrc
# chown root:root /etc/procmailrc
# chmod 644 /etc/procmailrc

In der Datei wird folgende Regel erstellt:


VERBOSE=YES
LOGFILE=/var/log/procmail
:0fw#* ^To: <[email protected]>| /usr/local/bin/email2fax


Dadurch werden E-Mails, welche an [email protected]l adressiert sind, ab sofort an das Script email2fax übergeben, und über Asterisk als Fax versendet.


______________________________________
Auszug aus dem Buch "Asterisk Kompakt"
www.bomots.de
______________________________________
 
Tolle sache, konabi,

vielen dank fuer dies detaillierte beschreibung!

Eine frage haett' ich da noch: wo wird denn festgelegt, aus welchem context und mit welcher nummer das zielfax angewaehlt wird? Das sollte ja idealerweise je nach destination festgelegt werden koennen, oder? Wie hast du das geloest?

Viel gruesse!
Chris
 
Hallo Chris,
die Zielnummer zum versenden des Faxes wird im Betreff Teil der E-Mail angegeben.
Das Script email2fax "pflückt dann die Email auseinander" und erzeugt ein Asterisk call File welches in das Verzeichnis /var/spool/asterisk kopiert wird. Darauf hin startet Asterisk einen Ruf.
und sendet ein FAX an die angegebene Rufnummer im Betreff Teil.
Das call File kannst Du dir übrigens im /tmp/ email2fax Verzeichnis anschauen. Du kannst es auch verändern und einfach mal in das Verzeichnis /var/spool/asterisk kopieren und sehen was der Asterisk macht.
Ein Kontext ist dabei nicht angegeben. Es handelt sich ja auch um einen ausgehenden RUF welcher nicht zu einem Kontext zugeordnet werden muß.

Ich werde aber das SCRIPT noch verändern und einen Kontext im callfile angeben. Siehe weiter oben [outgoing-fax]. Eine Auswertung des Rufs mittels ${DIALSTATUS} geht aber dabei nicht aber es könnte so gehen:

Callfile mit Angabe Kontext:
Code:
Channel: CAPI/contr1/25
MaxRetries: 0
WaitTime: 20
Context: outgoing-fax
Extension: sendfax
Priority:1
SetVar: FAXFILE=/tmp/email2fax/1133447586-251216000/install.tif

extension.conf:

Code:
[outgoing-fax]
exten => sendfax,1,txfax(${FAXFILE}|caller)
exten => sendfax.101,system(errorscript)

Das heist wenn der Faxversand nicht erfolgreich war erzeuge ich mit dem Hilfe von scriptfile eine Email und sende sie an den Faxversender.
Werde das mal nächtse Woche probieren.


Gruß Sven
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.