Faxempfang auf Asterisk mit Weiterleitung als TIFF-Datei im E-Mail-Anhang


In English——På svenska——En español——En français

Wichtiger Hinweis: Leider verfälschen die Google-Übersetzungen die Quellcodes. Bitte öffnet den Quellcode in einem anderen Fenster, wie es das nachstehende Bild zeigt. Von dort lassen sich die Quellcodes auch leichter herauskopieren:

9.4.2024

Eine schrittweise Anleitung, wie man den Faxempfang mit einer E-Mail-Weiterleitung auf einem Asterisk-Telefon-Server realisiert. Getestet mit Asterisk 16 und Raspbian Buster (Debian) auf einem Raspberry Pi 3 B. Die Wahlregel in der extensions.conf verschickt nach dem  Faxempfang automatisch eine E-Mail mit einer TIFF-Datei als Anhang, die dem empfangenen Fax, das aus mehreren Seiten bestehen darf, entspricht.  Für das Verschicken der E-Mails sorgt das Programm Mutt, das entsprechend zu konfigurieren ist.

Falls der Wunsch besteht statt TIFF-Dateien im E-Mail-Anhang PDF-Dateien zu verschicken, wird dies in einem späteren Artikel erklärt, denn dafür ist ein Python-Skript und ein Konvertierungsprogramm notwendig.

Screenshot von einem Android-Smartphone: Eingang eines E-Mails mit TIFF-Datei im Anhang von einem Fax-Empfänger, der mit Asterisk realisiert wurde.

Anleitung Faxempfang und E-Mail-Weiterleitung  mit TIFF-Dateien: Voraussetzung zum Verständnis und Gelingen der nachfolgenden Anleitung ist, dass ein Asterisk-Server bereits lauffähig auf einem Linux-Rechner (Debian) installiert und konfiguriert wurde.

Anlegen eines Ordners für die TIFF-Dateien: In diesem Beispiel müssen wir den Ordner /var/spool/asterisk/fax/incoming von Hand anlegen, in dem die eintrudelnden TIFF-Dateien abgelegt sind. Der Ordner braucht noch Berechtigungen für das Lesen:

sudo chmod -R 777 /var/spool/asterisk/fax/incoming/

Für die ersten Tests ist diese radikale Freigabe für jeden und alles in Ordnung. Allerdings sollte man aus Sicherheitsgründen später im Betrieb den Ordner nur für den Benutzer Asterisk freigeben.

Filezilla ermöglicht den Zugriff von einem anderen Rechner auf den Raspberry. Auf diese einfache Weise kann ich die eingegangenen Faxe auf meinem Windows-Rechner betrachten, kopieren, löschen und drucken.

Installation des E-Mail-Programms Mutt: Damit Asterisk in der Lage ist E-Mails zu verschicken, muss ein E-Mail-Programm installiert werden, das auch mit einem Befehl auf der Kommandozeilenebene unter Linux E-Mails verschicken kann. Die Wahl fiel auf das Programm Mutt. Wir installieren es mit

sudo apt-get update
sudo apt-get install mutt

Konfiguration von Mutt für die Versendung von E-Mails: Dazu müssen wir von Hand eine Datei .muttrc im Home-Verzeichnis anlegen. Wir nehmen das Home-Verzeichnis, in dem sich das Mutt und das Asterisk befindet. Die .muttrc-Datei wird normalerweise im Home-Verzeichnis des Benutzers abgelegt, der Mutt verwenden wird. Die Datei steuert die Konfigurationseinstellungen von Mutt, daher sollte sie im Home-Verzeichnis des Benutzers liegen, der Mutt verwendet. Wenn wir nicht sicher sind, können wir sie kopieren und in ein weiteres Home-Verzeichnis unterbringen. Dieser Datei vergeben wir solche Rechte, damit sie von allen gelesen werden kann.

Inhalt und Konfiguration der Datei .muttrc: Hier am Beispiel für eine E-Mail, die von Strato gehostet wird. Wir brauchen also eine bereits vorhandene E-Mail-Adresse, von der die E-Mails verschickt werden. Die muss natürlich nicht bei Strato sein. Anleitungen für jeden E-Mail-Provider gibt es im Internet. Nachfolgend der Inhalt einer .muttrc-Datei:

set from = "hans.mustermann@mustermann.de"
set realname = "Faxeingang via Server von Hans Mustermann"
set smtp_url = "smtps://hans.mustermann@mustermann.de:passwort@smtp.strato.de:465/"

set spoolfile = "/var/spool/asterisk/fax/incoming"
set folder = "/var/spool/asterisk/fax/incoming"
set mask = ".*"
mailboxes +INBOX

Die .muttrc erstellen wir mit der Erzeugung einer leeren txt-Textdatei, die wir nach .muttrc umtaufen und den Inhalt einfügen.

Hier im Beispiel habe ich eine fiktive hans.mustermann@mustermann.de eingetragen, die wie bereits erwähnt bei Strato gehostet ist. Der von Hand anzulegende Pfad /var/spool/asterisk/fax/incoming beschreibt den Ort, in welchem Asterisk die Faxe als TIFF-Dateien ablegt.

Wir können mit einem Befehl testen, ob die Konfiguration für das Versenden von E-Mails korrekt ist:

echo "Testnachricht von Mutt" | mutt -s "Test-E-Mail" beispiel@beispiel.de

Die beispiel@beispiel.de ist durch eine real existierende E-Mail-Adresse zu ersetzen.

Falls Mutt sich weigert E-Mails aus Asterisk zu verschicken: Falls sich keine E-Mails direkt aus den Wahlregeln der der extensions.conf von Asterisk verschicken lassen, muss eine Kopie der bereits erwähnten Datei .muttrc in den Ordner /var/lib/asterisk/ oder /home/asterisk/ kopiert werden. Bei meiner Asterisk-Version 16 war es /var/lib/asterisk/. Dieser Datei .muttrc habe ich alle Berechtigungen noch vergeben, damit sie jeder verändern und lesen kann:

sudo chmod 777 /var/lib/asterisk/.muttrc

Damit die Änderung durch das Umkopieren der .muttrc wirksam wird, muss Asterisk neu gestartet werden:

sudo systemctl restart asterisk
Endlich mit Mutt direkt aus extensions.conf von Asterisk faxen können, nachdem die .muttrc nach /var/lib/asterisk kopiert wurde und dieser Datei alle Berechtigungen zugeteilt wurden.

Wahlregel in der extensions.conf von Asterisk: Nachfolgend die Wahlregel in der extensions.conf für das Anrufen des Faxes mit der Nummer 1094. Damit lassen sich die Faxe als TIFF-Anhänge per E-Mail verschicken. Bitte auch den Kommentar im Skript durchlesen:

; Faxempfang auf der Nummer 1094 mit E-Mail-Weiterleitung und TIFF als Anhang

; Damit dieses Skript funktioniert, ist die konfigurierte .muttrc für Asterisk 16
; in den Ordner var/lib/asterisk/ oder bei anderen Versionen eventuell nach /home/asterisk/ zu kopieren.
; Der .muttrc alle Rechte für jeden vergeben.
; Nach dem Kopieren der .muttrc muss Asterisk mit
; sudo systemctl restart asterisk neu gestartet werden, damit die Änderung wirksam wird.

; Die empfangenen TIFF-Dateien sind im Ordner /var/spool/asterisk/fax/incoming untergebracht.
; Dieser Ordner ist mit Schreib-Leserechten für jeden Benutzer anzulegen.
; Als eindeutigen Namen erhalten die TIFF einen Zeitstempel.
; Nach fünf vergeblichen Verbindungsversuchen legt das Fax auf.
; Die E-Mail mit dem TIFF-Anhang wird als Beispiel an max@mustermann.de geschickt
; Die empfangenen TIFF-Dateien werden leider nicht automatisch gelöscht.

; TESTEN OHNE WEITERLEITUNG PER E-MAIL:
; Zum Testen ohne E-Mail-Weiterleitung ist die mit "same => n,System(echo "Sie haben ..." beginnende
; Befehlszeile auszukommentieren und in der ersten Zeile des Skripts eine Telefon-Nummer (extension) seiner Wahl
; einzutragen. Die TIFFs landen dann im Ordner /var/spool/asterisk/fax/incoming, den man
; von Hand anlegen muss und für das Schreiben, Lesen, Löschen und Kopieren freigeben muss.
 
 exten => 1094,1,Noop(Faxempfang 1094 Asterisk-Server von "${CALLERID(name)}" <${CALLERID(num)}>)
  same => n,Set(SIP_CODEC=g722)
  same => n,Answer()
  same => n,Set(FAXOPT(ecm)=yes)                           ; ECM-Fehlerkorrektur
  same => n,Set(TRYCOUNT=0)                                ; Initialisieren der Versuchsanzahl
  same => n,Set(FAXDEST=/var/spool/asterisk/fax/incoming)  ; Pfad empfangener TIFFs
  same => n,Set(tempfax=${STRFTIME(,,%C%y%m%d%H%M%S)})     ; vergibt TIFF Namen mit Zeitangabe auf die Sekunde genau
  same => n(label),ReceiveFax(${FAXDEST}/${tempfax}.tif)   ; TIFF empfangen, wenn möglich

  same => n,NoOp(STATUS: ${FAXOPT(status)})                ; Info, ob erfolgreich oder gescheiterer Faxversand
  same => n,NoOp(RESOLUTION: ${FAXOPT(resolution)})        ; Auflösung des Fax
  same => n,NoOp(RATE: ${FAXOPT(rate)})                    ; Geschwindigkeit der Übertragung
  same => n,NoOp(PAGES: ${FAXOPT(pages)})                  ; Anzahl übertragener Seiten  
  same => n,NoOp(ERROR: ${FAXOPT(error)})                  ; Fehlermeldung der Übertragung
   
  ; same => n,System(convert ${FAXDEST}/${tempfax}.tif ${FAXDEST}/${tempfax}.pdf) ; Geht nicht, da Asterisk nur ein System- oder AGI-Befehl verarbeiten kann.
  same => n,System(echo "Sie haben von "${CALLERID(name)}" <${CALLERID(num)}> ein Fax erhalten. Sie finden das Fax als TIFF-Datei im  Anhang. Mehrseitige TIFF-Dateien lassen sich mit IrfanView unter Windows oder dem Multi-TIFF Viewer unter Android betrachten." | mutt -s "Faxnachricht via SM5ZBS-Asterisk-Server erhalten" max@mustermann.de -a "${FAXDEST}/${tempfax}.tif")

  same => n,Set(TRYCOUNT=$[${TRYCOUNT} + 1])               ; Weiterer Verbindungsversuch
  same => n,GotoIf($[${TRYCOUNT} < 5]?label)               ; 5 Verbindungsversuche bis zum Auflegen
  same => n,Hangup()                                       ; Auflegen
Empfang eines Faxes mit dem obigen Skript im CLI von Asterisk.

Der Zeitstempel: Ursprünglich war der Zeitstempel für die Bezeichnung der TIFF-Dateien nur auf die Minute genau. Treffen in derselben Minute zwei oder mehrere Faxe gleichzeitig ein, gibt es einen Konflikt. Die TIFF-Dateien mit derselben Bezeichnung werden im Ordner überschrieben. Sie werden jedoch zum Glück per E-Mail korrekt zugeordnet und verschickt, weil die Faxe der Reihe nach abgearbeitet werden. Den Zeitstempel habe ich nachträglich auf sekundengenaue Bezeichnung abgeändert. Dieser sekundengenaue Zeitstempel

same => n,Set(tempfax=${STRFTIME(,,%C%y%m%d%H%M%S)})

ist jedoch nicht zwingend notwendig und könnte wie folgt durch UNIQUEID ersetzt werden:

exten => 1094,1,Noop(Faxempfang auf Asterisk von "${CALLERID(name)}" <${CALLERID(num)}>)
 same => n,Set(FAXOPT(ecm)=yes)                             ; ECM-Fehlerkorrektur
 same => n,Set(FAXDEST=/var/spool/asterisk/fax/incoming)    ; Pfad empfangener TIFFs
 same => n,Set(UNIQUE_ID=${UNIQUEID})                       ; Eindeutige ID von Asterisk generiert
 same => n,ReceiveFax(${FAXDEST}/${UNIQUE_ID}.tif)          ; TIFF empfangen, wenn möglich
 same => n,Noop(STATUS: ${FAXOPT(status)})                  ; Info, ob erfolgreich oder gescheiterter Faxversand
...

UNIQUEID bewirkt eine eindeutige und fortlaufende Nummerierung. Man ist dann auf der sicheren Seite, wenn die TIFF unbedingt im Ordner gespeichert werden müssen. Der Teufel steckt im Detail.

Anpassen der sip.conf: In der Regel muss die sip.conf nicht verändert werden. Wichtig ist, dass das Faxprotokoll T.38 nicht aktiviert ist. Normalerweise ist es nicht aktiviert. Unter [general] der sip.conf sollte folgendes stehen:

faxdetect=yes ; kann auch auf no stehen.
; t38pt_udptl=yes
; directmedia=no

T.38 habe ich leider nicht zum Laufen gebracht.

Lesen der empfangenen TIFF-Dateien: Der TIFF-Betrachter muss bei mehrseitigen Faxen auch mehrseitige TIFF-Dateien lesen können. Unter Windows kommt dazu das allseits beliebte Bildbetrachtungsprogramm IrfanView zum Einsatz. Für Smartphones mit Android verwende ich aus dem Playstore die App Multi-TIFF Viewer.

Leider funktioniert die Umwandlung von TIFF nach PDF noch nicht, da in einer Wahlregel nicht mehrere System- oder AGI-Befehle hintereinander ausgeführt werden können. Ein Ausweg wäre es die Aufrufe von System-Befehlen in ein AGI-Skript zu verlagern. Kommt noch.

Wie testet man bequem den Faxempfang: Das geht meiner Erfahrung nach mit dem mit wenigen Mausklicks einfach zu bedienenden Fax-Sip-Softphone VentaFax für Windows. Die Demoversion reicht aus. Das Ventafax ist quasi ein SIP-Softphone mit Faxfunktion und erlaubt es eine SIP-Nummer zu registrieren. Wir brauchen also kein Faxmodem und kein ATA. VentaFax versendet unter anderem auch PDF-Dateien.

Das Fax-SIP-Softphone VentaFax für Windows eignet sich prima, um Testfaxe für die Softwareentwicklung zu verschicken.

Schlussbemerkung: Die Installation ist einfach, wenn man weiß, wie es geht. Tatsächlich hat es mich ungezählte Stunden über eine Woche verteilt gekostet die richtige Konfiguration und Syntax herauszufinden, wobei drei Fehler gleichzeitig auftragen, die einem in die Irre führten. 1. War die Syntax für das Eintragen der E-Mail in .muttrc nicht eindeutig beschrieben. 2. fand ich durch Zufall im Internet den Hinweis, dass man die .muttrc noch in ein Verzeichnis von Asterisk umkopieren muss. 3. War in der Literatur die Syntax für den Befehl mit Mutt eine E-Mail mit Anhang zu verschicken in der falschen Reihenfolge beschrieben. Ganz einfach war es hingegen eine einfache Wahlregel für den Faxempfang zu schreiben.

Wahrscheinlich interessieren sich nur noch sehr wenige Menschen auf der  ganzen weiten Welt für dieses Thema, denn Faxgeräte sind eigentlich nur noch etwas für Interessenten an der Geschichte der Technik. Dennoch war es für mich jedenfalls keine Zeitverschwendung, denn ich habe viel gelernt dabei und das Thema ist noch lange nicht ausgeschöpft.

Mehr zum Thema Faxversendung aus Asterisk und weitere Hilfestellungen:

Fiktives Faxgerät von der KI GenCraft erzeugt (Bildquelle: GenCraft)
Faxempfang auf Asterisk mit und ohne E-Mail-Weiterleitung – 2.4.2024: Der Empfang von Faxen lässt sich in Asterisk mit ein paar Programmzeilen umsetzen. Sie ist aber einfach zu verstehen und beliebig ausbaufähig. Getestet mit Asterisk 16 auf einem Raspberry Pi. Wir müssen nur in der sip.conf und in der extensions.conf  ein paar Zeilen hinzufügen und noch einen Ordner anlegen und freigeben, in welchem die Faxeinrichtung die Faxe als TIFF-Dateien ablegt. Anschließend gibt es noch eine Lösung mit einer E-Mail-Weiterreichung der Faxe. – weiter

Mit dem FTP-Client FileZilla gelingt von Windows aus der Zugriff auf Raspberry-Dateien. Der Raspberry kann das von Haus aus.
Von Windows auf den Raspberry Pi zugreifen – 5.12.2021: Auf meinem Raspberry Pi betreibe ich einen kleinen SIP-Server mit Asterisk. Von Windows 10 aus möchte ich direkten Zugriff auf die Asterisk-Konsole und auf die Kommandozeilenebene (CLI) des Raspbian haben. Außerdem möchte ich zur Datensicherung und zu Konfigurationszwecken die Konfigurationsdateien von Windows aus sichern und verändern können. Dies erspart einen zweiten Bildschirm. – weiter

Auf einem Raspberry Pi lässt sich ein kompletter Telefonserver betreiben, der seinen Teilnehmern über Landesgrenzen hinweg kostenloses Telefonieren von unterwegs oder daheim ermöglicht.
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Sicherheit und Tipps zum praktischen Betrieb – 2.11.2022: Diese Seite richtet sich an jene, welche einen Asterisk-Telefon-Server auf einem Raspberry Pi betreiben möchten und später ein kleines Netzwerk aus Asterisk-Servern planen, um ein eigenständiges Telefonnetz aufzubauen. Los geht es mit der Installation von Raspbian und Asterisk auf einem Raspberry Pi und dann nach Lust und Laune immer tiefer in die Programmierung von Asterisk. Die Themen werden laufend erweitert.

Selbstverständlich muss es nicht unbedingt ein Raspberry Pi sein. Andere Linux-Rechner gehen auch. – weiter