Manchmal möchte man aus einem Programm oder einem Skript heraus eine SMS versenden. Insbesondere zum Monitoring ist das sehr wichtig. Prinzipiell gibt es verschiedene Methoden:
Ich habe mich beim Webdienst Any-SMS
angemeldet. Dort muss man einen kleinen Betrag vorauszahlen (mindestens 10 Euro) und kann dann ab ca. 3 ct (je nach Service-Qualität) SMS über eine Webschnittstelle versenden. Neben der Webschnittstelle, die schön z.B. für den Massenversand von Informationen oder Werbung ist, gibt es auch eine WEB-API. Diese ist gut dokumentiert und eigentlich recht einfach aufgebaut. Man kann einfache SMSe per wget versenden. Das folgende Groovy-Skript zeigt, wie man es in einer Skript-Sprache machen kann (eine Umsetzung in Java sollte auch kein Problem sein.
Nachteil dieser Methode, insbesondere zum Monitoring ist, das man einen funktionierenden Internet-Anschluss benötigt. D.h., falls der Internet-Anschluss oder der Router oder ein Switch auf dem Weg dahin ausfällt, erfährt man das leider nicht...
#!/usr/bin/groovy
//
// SMS-Versand per any-sms in Groovy
//
class SmsVersand{
static main(args){
// Konfiguration
def id = '123456'
def pass = 'meinapipasswort'
// Absender darf nur 11 Zeichen haben, kann eine Telefonnummer oder Text sein
def absender = 'Icinga'
def gateway = 20
def url = 'http://gateway.any-sms.biz/send_sms.php'
// Parameter einlesen
//def nummer = '01638641980'
//def text = 'Test-Text des SMS-Versendeprogramms äöüÄÖÜ-ß-€- ätsch!'
def nummer = args[0]
def text = args[1]
// URL-Encoding des Textes
// Umlaute müssen mit dem ISO-8859-11 Wert kodiert sein
// (wer mir erklärt, wie das mit Umlauten richtiger geht, nur her damit!)
text=URLEncoder.encode(text)
text=text.replaceAll(/%C3%A4/,'%E4')
text=text.replaceAll(/%C3%B6/,'%F6')
text=text.replaceAll(/%C3%BC/,'%FC')
text=text.replaceAll(/%C3%84/,'%C4')
text=text.replaceAll(/%C3%96/,'%D6')
text=text.replaceAll(/%C3%9C/,'%DC')
text=text.replaceAll(/%C3%9F/,'%DF')
text=text.replaceAll(/%E2%82%AC/,'%80')
// URL zusammensetzen
def gesamturl="$url?id=$id&pass=$pass&gateway=$gateway&nummer=$nummer&absender="+
URLEncoder.encode(absender)+"&text=$text&test=0&xml=1"
//println gesamturl
// Verbindung herstellen
def conn = new URL(gesamturl).openConnection()
def result = conn.inputStream.getText()
//println result
def jetzt=new Date()
def format=new java.text.SimpleDateFormat('yyyyMMdd_HHmmss')
def logdir=new File("/var/log/sms/")
logdir.mkdir()
def outfile=new File(logdir.getPath()+"/"+format.format(jetzt))
outfile.write(gesamturl)
outfile.append("\n")
outfile.append(result)
result = new XmlSlurper().parseText(result)
if(result.error != 0){
System.exit 100
}
println "Restguthaben: $result.guthaben"
System.exit 0
}
}
Da ein USB-Stick ja eigentlich auch eine Art Handy ist, kann man mit diesem (oder auch mit einem normalen Handy, das z.B. per USB-Kabel angeschlossen ist), natürlich auch SMS versenden. Hierzu gibt es das recht ausgereifte Paket Wammu/Gammu
. Es gibt drei Möglichkeiten, hiermit umzugehen:
Da nichts so schön ist wie ein Beispiel hier ein SMS-Versand mit gammu:
gammu sendsms text 01631234567 -text "SMS vom Icinga-Server"
Wenn der Daemon installiert ist, kann man sich aussuchen, ob man den vorhandenen File-Provider zur Ablage der Daten benutzt oder die Daten lieber in eine Datenbank schreibt. Ich habe hierzu eine PostgreSQL-Datenbank benutzt. Leider muss man die Struktur der Datenbank "von Hand" erzeugen. Dabei war zu beachten, das Debian Squeeze das Gammu-PAket in Version 1.28.0 benutzt. Dieses benutzt die Datenbank-Struktur in der Version 11. Aktuell in der Doku auf der Webseite ist die Version 13. Also nicht einfach das SQL-Skript von der Webseite nehmen, sondern hübsch ein passendes Source-Paket suchen und daraus die richtige Version ziehen.
Nun kann man per SQL mit folgendem Befehl eine SMS versenden:
INSERT INTO "outbox" ("textdecoded","destinationnumber","creatorid") VALUES ('Test-Text per SMSD','016312345678','')
Wer es jetzt immer noch auf der Kommandozeile mag, nimmt dazu einen Befehl, der die SMS nicht selber versendet, aber sie in die konfigurierte Datenbank schreibt:
gammu-smsd-inject TEXT 016312345678 -text "All your base are belong to us"