SMS-Versand#

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:

  1. Man kann ein angeschlossenes Handy (MitDemHandyInsInternet) als Modem benutzen und über spezielle Befehle (SMSFormat) SMS absetzen.
  2. Man kann (wenn ich mich recht erinnere) über eine direkte API und einen UMTS-Stick SMS versenden (muss man aber nochmal genauer recherchieren)
  3. Man kann einen Webservice nutzen, der die SMS verschickt.

per Webservice#

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
  
    }
  }

Tags:  Monitoring, Groovy, Java