eMail to Messaging Gateway

Nicht selten möchte man über bestimmte Betriebszustände informiert werden. Da fast alle Überwachungsprogramme zwar eMail, aber oft keine Messagingdienste unterstützen, bietet sich der Einsatz eines eMail zu Messaging Gateways an.

Das hier beschriebene, auf Ubuntu laufende System, verwendet den bekannten und sicheren MTA Postfix und den von Open Whisper Systems entwickelten sicheren Messenger Signal. Ich habe mich bewusst für Signal entschieden, da ich nicht will, dass ich irgendwann Empfehlungen, bzw. Werbung zu meinen Nachrichten erhalte ("Dieser Ausfall eines Switchports wird Ihnen präsentiert von Mannsbräu Dunkel"), oder dass meine Nachrichten ins kyrillische konvertiert werden.

Die Anbindung an Signal übernimmt die signal-cli. Da es sich hierbei um ein Java-Programm handelt, das bei jedem Aufruf eine JRE starten muss, und damit erhebliche Verzögerungen mit sich bringt, habe ich mich für die Nutzung des DBUS Interfaces entschieden. Hierbei wird signal-cli als Dienst gestartet und die Nachricht mittels DBUS übergeben.

Installation der notwendigen Software

Postfix:
apt install postfix

JRE:
apt-get install default-jre

Nun Signal-Cli von github.com/AsamK/signal-cli/releases herunterladen und z.B. nach /opt entpacken.
cd /opt
wget github.com/AsamK/signal-cli/releases/download/v0.6.0/signal-cli-0.6.0.tar.gz
tar xfz signal-cli-0.6.0.tar.gz

Konfiguration der Softwarekomponenten

signal-cli
In das Verzeichnis wechseln z.B. /opt/signal-cli-0.6.0
Dann nach bin wechseln

Im ersten Schritt muss eine Registrierung bei Signal erfolgen.
./signal-cli -u +49921987654 register [--voice]
Mit --voice erhält man einen Anruf, ohne eine SMS. So kann man auch Festnetznummern zur Registrierung verwenden. Die Telefonnummer hinter -u ist dabei entweder eine eigene Mobil oder auch eine Festnetznummer.

Nach der Registrierung muss die Nummer nun noch verifiziert werden:
./signal-cli -u +49921987654 verify ABC-DEF
ABC-DEF muss hier durch den erhaltenen, bzw. vorgelesenen Code ersetzt werden.

Nach erfolgreichem Abschluss kann auch schon die erste Signal Nachricht versendet werden:

./signal-cli -u +49921987654 send -m "Erste Nachricht" +49171234567
Der Empfänger ist dabei ebenso im internationalen Format anzugeben

Nun muss der Benutzer signal-cli für den Daemon angelegt und die Dateien aus ~/.config/signal in das gleichnamige Verzeichnis von signal-cli kopiert werden.

adduser signal-cli
cd /home/signal-cli/
cp -R ~/.config

Und die Rechte entsprechend anpassen:
chown -R signal-cli .config

Für die DBUS Nutzung fehlen noch drei Pakete:
apt install libunixsocket-java
apt install python-pip
pip install pydbus

Von github.com/AsamK/signal-cli/tree/master/data die vier Files holen und wie folgt im System kopieren/verschieben:

cp org.asamk.Signal.conf /etc/dbus-1/system.d/
cp org.asamk.Signal.service /usr/share/dbus-1/system-services/
cp signal.service /etc/systemd/system/

In der Datei /etc/systemd/system/signal.service müssen nun die beiden Variablen %dir% und %number% angepasst werden. Im Beispiel sind das /opt/signal-cli-0.6.0 für %dir% und +49921987654 für %number%.
Nun muss noch der Substring "--config /var/lib/signal-cli" gelöscht werden, da die Konfiguration nicht global sondern ausschliesslich für den Benutzer signal-cli gelten soll.

Nach den Änderungen müssen alle beteiligten Dienste noch aktiviert, bzw. neu geladen werden.
systemctl daemon-reload
systemctl enable signal.service
systemctl reload dbus.service

Testen kann man den Erfolg der oben durchgeführten Änderungen als Benutzer signal-cli, indem man in der Shell folgenden Befehl absetzt:
/opt/signal-cli/bin/signal-cli --dbus-system send -m "Erste Nachricht" +49171234567

Kommt die Nachricht am Signal Client, z.B. auf dem Handy an, ist die Einrichtung von Signal- Cli bzw. die Anpassung am DBUS erfolgreich abgeschlossen.
Weiter geht es mit einem Script (/opt/signal-out.py), das final durch eine Mail an Postfix getriggered wird. Das Script nimmt die per STDIN erhaltene Mail, extrahiert den Body und übergibt diesen per DBUS an das Signal-Cli.

#!/usr/bin/env python2
import sys
from pydbus import SystemBus
from gi.repository import GLib
import email

_bus_name = 'org.asamk.Signal'
_object_path = '/org/asamk/Signal'

phonenumber = sys.argv[1]

msg = email.message_from_file(sys.stdin)

if msg.is_multipart():
for part in msg.walk():
ctype = part.get_content_type()
cdispo = str(part.get('Content-Disposition'))

if ctype == 'text/plain' and 'attachment' not in cdispo:
body = part.get_payload(decode=True)
break
else:
body = msg.get_payload(decode=True)

bus = SystemBus()

signal = bus.get(_bus_name, _object_path)

signal.sendMessage(body, [], [phonenumber])
Der nächste Schritt ist nun die Anpassung der Postfix Konfiguration. Für den beabsichtigten Zweck beschränkt sich dies auf zwei Zeilen:
In der main.cf muss die Zeile
local_destination_recipient_limit = 1
eingefügt werden.

In /etc/aliases wird dann noch der gewünschte Alias, hier "signal-rs" definiert, und das Script mit der Telefonnummer als Ziel angegeben:
signal-rs: "|/opt/signal-out.py +49171234567"

Nachdem die Alias-Map neu gebaut ist und der Postfix Daemon neu geladen wurde ist alles bereit.
Der Body einer Mail an z.B. signal-rs@msg.bayreuth.tk wird automatisch über Signal versendet.