MAIL-TO-MESSAGE-GATEWAY mit Perl
Teil 1
1. Allgemeine Beschreibung
1.1. Funktionen
"mail2msg.pl", wie dieses in Perl geschriebene Script richtig heißt, kann in
einem Home- oder kleinen bis mittleren Intranet als universelles
MAIL-TO-MESSAGE-GATEWAY eingesetzt werden.
Auf die Idee dazu kam ich als für das (sehr gute und funktionale) Groupware-Programm
"PHProjekt" ein SMS-Reminder als Add-on herauskam.
Dieses verschickt Terminerinnerungen jetzt auch als SMS an den betreffenden User. Dazu nutzt
es "Mail-to-SMS" Dienste des Internets (vom User "beizustellen" - fast jeder hat ja bei
seinem Mail-Account so etwas dabei).
Da in unserem Intra- und meinem Home-net schon ein "Web-to-SMS-Gateway"
(auch nur ein Perl-CGI-Script) erfolgreich mit "YAPS" zusammenarbeitet, suchte ich nach
einer solchen Lösung, fand aber nicht so ganz das richtige. Also nahm ich das Script
"smsmail.pl" Version 0.1 von
Daniel Stenberg
und "bastelte" daran herum. Für die gute Vorlage nochmals vielen Dank an ihn.
Die Zur Zeit vorliegende Version 0.1.1 erfüllt folgende Aufgaben:
Eingehende Mails:
- mit Hilfe von "Yaps" als SMS versenden
- mit Hilfe von Winpopup Windows-Usern auf den Bildschirm schicken
Screenshot einer Mail an Mail-to-Winpopup
Screenshot Nachricht in Winpopup erhalten
- Versenden einer Bestätigungssmail an Absender
- Versenden einer Fehlermeldungs-Mail an Absender
Screenshot einer Bestätigungsmail
|
Screenshot einer Fehlermeldungs-Mail
|
- einstellbare Länge der Messages) (default=90 Zeichen, da noch Absender und
SMS-Serversignatur dazukommen
- einstellbare Länge einzulesender Zeichen pro Zeile (default=256 Zeichen)
der Mail
- Einstellbare max. Zeilenzahl fürs Einlesen (sollte doch mal eine Mail mit
Attachment "auftauchen" - default=40)
Dazu können die Mails folgende Formate aufweisen:
- für das Mail-to-SMS-Gateway:
- Handy-Nr@sms.your-domain.de
- sms@your-domain.de
Handy-Nr im "Subject" der Mail
- für das Mail-to-Winpopup-Gateway:
- User-Name@winpopup.your-domain.de
- winpopup@your-domain.de
User-Name im "Subject" der Mail
Das Script ist so aufgebaut, dass relativ einfach andere Messaging-Dienste eingebunden
werden können. Zwischen Zeile 300 und 371 sind die bis jetzt implementierten Dienste
konfiguriert. Das Script ist sehr gut dokumentiert, ihr werdet euch
schnell zurechtfinden. Hier ist eure Phantasie gefragt für welche Dienste es noch
genutzt werden kann. Ich hoffe ich höre
bald von euch!
1.2. Voraussetzungen
- Das Vorhandensein eines funktionienden Mailservers (bei mir läuft sendmail auf
SuSE 7.2). Andere Mailserver funktionieren genauso, wenn sie die Verwendung der
Mail-Aliase aus /etc/mail/aliases unterstützen.
- Für das Mail-to-SMS-Gateway: das Vorhandensein von Yaps sowie seine
schon getestete Funktionalität. Dazu findet ihr
hier ein paar Tips.
- Für das Mail-to-WINPOPUP-Gateway: installierter Samba-Server.
- Installiertes Perl - (und ein kleines bißchen Mut um es mal auszuprobieren;-).
1.3. Installation
Als erstes das Script hier herunterladen,
die Endung ".txt" entfernen und in ein Verzeichnis eurer Wahl verschieben (bei mir
/usr/local/bin).
In diesem Verzeichnis müssen dann der Besitzer, die Gruppe und die Zugriffsrechte angepasst
werden:
| user |
group |
Rechte |
| daemon |
nogroup |
0600 |
Sehr gut lässt sich das mit dem MidnightCommander machen: ([Strg+X,O] für user und group,
[Strg+X,C] für Berechtigungen). Von Hand geht es mit folgenden Befehlen:
server:~ > cd /usr/local/bin
server:/usr/local/bin > chown daemon:nogroup mail2msg.pl
server:/usr/local/bin > chmod 0600 mail2msg.pl
In diesem Verzeichnis "symbolischen Links" mit "sprechenden" Namen auf das Script
Anlegen:
- Bei SMS -> Tel-Nr. im "Subject": mail2sms_in_subj.pl
- Bei SMS -> Tel-Nr. im "To": mail2sms_in_to.pl
- Bei Winpopup -> Tel-Nr. im "Subject": mail2winpop_in_subj.pl
- Bei Winpopup -> Tel-Nr. im "To": mail2winpop_in_to.pl
Mit dem MC geht dies über [Strg+X,S], von Hand:
server:~ > cd /usr/local/bin
server:/usr/local/bin > ln -s mail2msg.pl mail2sms_in_to.pl
1.4. Konfiguration
1.4.1 Konfiguration des Perl-Scriptes
Im Script selber müssen nur die Variablen im oberen Teil angepasst werden:
- Namen des Scriptes für die verschiedenen Aufgaben
- $mail_domain: Die lokale Mail-Domain des Severs/PC's
- $YAPS_BIN: Pfad zum SMS-Programm YAPS
- $MAILER: Pfad zum (und evtl. Optionen für...) lokalen SMTP-Mail-Server
- $PROG_ABS: Mail-Absender des Programmes
- Jetzt evtl. noch die Nachrichtenlänge u.a. Kleinigkeiten (ist sehr gut im Script
dokumentiert)
1.4.2 Erster Test ob alles funktioniert
An dieser Stelle der Arbeit bietet sich ein Test an. Dazu kopiert man sich den Inhalt
einer Mail mit Header! in
eine einfache Textdatei.
Zwischen Header und Body muß eine Leerzeile stehen. So wird auch bei den Mails getrennt.
Diese Datei (zum Testen) in das Verzeichnis von "mail2msg.pl" verschieben.
In dieser Mail verändert man nun die Daten im Subject und/oder im To so wie es später
auch in der tatsächlichen Mail stehen sollte, bzw. man provoziert Fehler durch weglassen
der Angaben nach "From", "To" oder im "Bodys". In den Zeilen [311 und 331] werden die
richtigen Versende-Befehle deaktiviert. Daraufhin würde eine Fehlermeldung ausgegben werden,
weil kein 0-Return von der Ausführung des Versandbefehls kommt. Deshalb sollte der Wert von
$send_response = 0; (in Zeile [292]) gesetzt werden. Wenn keine anderen Fehler auftauchen, sollte
das Script jetzt annehmen, dass der Versand ordnungsgmäß abgeschlossen wurde.
Mit folgenden Befehlen testet man:
server:~ > cd /usr/local/bin
server:/usr/local/bin > cat test-mail.txt | ./mail2sms_in_to.pl
Daraufhin solltet ihr eine Bestätigungs-mail an die Absenderadresse gesendet bekommen. Darin
steht die Versandbestätigung oder welche(r) Fehler auftrat(en).
1.4.3 Konfiguration am Mail-Servers
Die Hauptarbeit ist eigentlich am Mailserver zu erledigen. Dazu ins Verzeichnis
/etc/mail wechseln.
- hinzufügen folgender Zeilen zu aliases:
### Alles was an User "..." (Teil vor dem @) geht, an
# dieses Programm übergeben
#
sms: "|/usr/local/bin/mail2sms_in_subj.pl"
mail2sms: "|/usr/local/bin/mail2sms_in_to.pl"
winpopup: "|/usr/local/bin/mail2winpop_in_to.pl"
abspeichern und mit "newaliases" "/etc/newaliases.db" aktualisieren
- hinzufügen folgender Zeilen zu virtusertable:
### Alles was an Adresse "..." geht, an diesen
# User (in Aliases definiert) weiterleiten
#
@sms.your-domain.de mail2sms
sms@your-domain.de sms
@winpopup.your-domain.de winpopup
abspeichern und mit "makemap hash virtusertable.db < virtusertable"
neue ".db"-Datei erstellen
- (bei SuSE) entweder in /etc/rc.config.d/sendmail.rc.config bei
"sendmail_localhost" folgende Domains ergänzen:
sms.your-domain.de winpopup.your-domain.de und danach "SuSEconfig --modules sendmail"
aufrufen oder diese untereinander in
/etc/mail/sendmail.cw eintragen
Als letzter Schritt steht ein Neustart oder Reload des Mailservers an:
rcsendmail restart oder rcsendmail reload
Von da ab sollte alles funktionieren. Das testet man am besten gleich mit ein paar Mails
(wobei aus Kostengründen der SMS-Versand weiter deaktiviert bleiben sollte). Mittels
tail -f /var/log/mail auf einer anderen Konsole erkennt man Probleme des Mail-Servers
relativ schnell. Funktioiert dies alles zufriedenstellend werden die Kommentare vor dem
SMS-Versand entfernt sowie die Variable $send_response = 1; gesetzt.
1.5. Probleme
Dieses Script ist relativ einfach aufgebaut (ohne Verwendung von Modulen). Deshalb erfolgt
keine MIME-gerechte Verarbeitung der eingehenden Mails. Das kann dazu führen, dass verschiedene
Sonderzeichen nicht richtig behandelt (je nach Mail-Server) oder weitergegeben werden können.
Weitere Probleme sind mir bisher nicht bekannt, wenn ihr aber welche findet
mailt mir mit
einer aussagefähigen Beschreibung wann und unter welcher Konstellation es zum Fehler kam.
Soweit es meine (doch sehr knappe:-() Zeit zulässt werde ich mir das ansehen und versuchen
zu helfen.
1.6. Wie weiter?
Ich hoffe euch ein paar Anregungen gegeben zu haben und würde mich über weitere Funktionen
für dieses Script freuen. Ich selbst werde mich irgendwann mal mit den Perl-Modulen zum
Mail-Handling beschäftigen müssen, damit manches noch einfacher gehen könnte, es fehlt
bloß immer wieder die nötige Zeit.
Sobald mich die Langeweile packt ;-) versuche ich in einem zweiten Teil die einzelnen
Funktionen des Perl-Scriptes näher zu erläutern, so dass auch andere Perl-Anfänger (wie ich
ja auch einer bin) verschiedene Vorgehensweisen besser verstehen können und so Anregungen
für eigene Programmierversuche bekommen. Bis dahin müsst ihr euch mit der Dokumentation
im Script selbst begnügen, die ich eigentlich reichlich gestreut habe;-).
|