SMS- und e-Mailgenerierung mit XML und XSL

Maurice Kowalski

 

XML und XSL sind [A1] durch die Präsentation von Inhalten auf unterschiedliche Medien bekannt geworden. XML ist mit Hilfe von XSL auf unterschiedlichste Formate (HTML, WAP, PDF, etc.) formatierbar. Durch die Kodierung von Nachrichten mit XML steht der Kommunikationsweg zum Empfänger frei, da entsprechend der Art des Versandes die Information mit XSL anpassbar ist.

 

Dieser Artikel beschäftigt sich mit dem Versand von XML kodierten Mitteilungen [A2] via SMS und e-Mail.

 

Nachrichten versenden über ein Webinterface

Im ersten Schritt wird eine standardisierte Schnittstelle zum Versenden von e-Mail und SMS benötigt. Hierfür bietet sich das Webinterface an. Auf diese Art und Weise ist es denkbar, e-Mail und SMS zu verschicken, ohne auf die unterschiedlichen Protokolle von SMTP und des SMSC einzugehen. Der Versand einer e-Mail über ein Webinterface könnte wie folgt aussehen:

 

http://www.objectmentor.de/email.php?absender=kowalski@objectmentor.de&empfaenger=erwin@mustermann.de&nachricht=Alles+wird+gut

 

Bei der Nutzung von http als Transportprotokoll ist darauf zu achten, dass Sonderzeichnen URL kodiert sind.

 

Die Werkzeuge

Ein großer Vorteil in der Nutzung von XML und XSL ist, dass die notwendigen Parser und Transformationswerkzeuge bereits zur Verfügung stehen. Ein geeigneter XSL Prozessor wird von der Apache Software Foundation [APACHE] unter dem Namen Xalan für Java [AXA01]  im Open-Source-Konzept angeboten. Der Xalan wiederum verwendet den XML Parser Xerces für Java [AXE01], um das XML zu verarbeiten.

 

Der XML Datencontainer

Für die Aufbereitung der Nachricht ist es wichtig eine klare Gliederung zu erstellen, um diese dann in XML zu verschlüsseln. Eine zu versendende Nachricht besteht aus drei Teilen:

 

·         Absender             (sender)

·         Empfänger            (receiver)

·         Nachricht              (text)

 

Im Kopf des XML Datencontainers ist [A3] die Art der Kodierung angegeben:

 

<?xml version="1.0"?>

 

Im Rumpf befindet sich die eigentliche Nachricht. Die oben beschriebende Gliederung findet sich in der Struktur des XMLs als Tags wieder.

 

<message>

 

Der Absender der Nachricht wird in zwei Varianten bereit gestellt, so dass er beim Versenden entsprechend der Versandart zu Verfügung steht.

 

                <sender>

                               <name>objectmentor</name>

                               <email>info@objectmentor.de</email>

                </sender>

 

Für den Empfänger der Nachricht wird die e-Mail Adresse, die Mobilfunknummer sowie die gewünschte Art des Versands der Nachricht angegeben:

 

                <receiver>

                               <type>email</type>

                               <email>erwin@mustermann.de</email>

                               <mobil>+491771234567</mobil>

                </receiver>

 

Zum Abschluss folgt der eigentliche Nachrichtentext:

 

                <text>Das neue Java-Magazin ist da!</text>

 

Die XML-konforme Beendigung des XML Datencontainers[A4]  bildet das Finale:

 

</message>

 

Den Aufbau der XML Nachricht entnehmen Sie dem Listing 1.

 

 

Wie wird eine SMS versandt?

Der SMS-Nachrichtenversand findet mit Hilfe von SMSC statt. Demzufolge wird ein SMSC benötigt, das ein Webinterface für den Versand von SMS Nachrichten anbietet. Für diesen Artikel wurde die Firma EDIS.AT [EDI01] gewählt, weil sie eine Webschnittstelle namens HTTP2SMS anbieten. Dieses Webinterface ist über PHP [PHP01] mit der URL

 

http://edis.at/sms.php3

 

ansprechbar.

 

SMS versenden über HTTP2SMS

Die Schnittstelle HTTP2SMS erwartet die folgenden Parameter für den Versand von SMS-Nachrichten:

 

·         id            - Nutzerkennung

·         pw          - Passwort

·         dnr         - Empfänger

·         snr          - Absender

·         msg        - Mitteilung

·         flash       - Flashmodus (wird in diesem Artikel nicht weiter berücksichtigt)

 

Demzufolge könnte eine Anfrage an das Webinterface von HTTP2SMS wie folgt aussehen:

 

http://edis.at/sms.php3?id=XXX&pw=XXX&dnr=%2B491771234567&snr=objectmentor&msg=Alles+wird+gross&flash=0

 

Die Angaben der Empfängermobilnummern erfolgt im Format

 

+49 +Netzbetreibercode + Rufnummer .

 

Dabei verwandelt sich durch die URL-Kodierung das Pluszeichen in den URL-Code %2B. Der Absender hingegen darf alphanumerisch gewählt sein, wobei Leerzeichen durch URL-Codierung als Pluszeichen dargestellt werden. Die Konvertierung der Leer- bzw. Sonderzeichenkodierung innerhalb der Mitteilung ist in den entsprechenden URL-Code zu erfolgen .

 

Die http-Anfrage erfolgt an das EDIS.AT SMSC. Der Server leitet [A5] die SMS Nachricht in das globale Mobilfunknetz weiter. Der Ablauf des Versandes ist in der Abbildung „SMS Versandablauf“ dargestellt.

 

e-Mail versenden mit PHP

Für den Versand einer e-Mail wird ein PHP-Skript erstellt, das mit den Parametern

 

·         empfaenger

·         absender

·         nachricht

 

e-Mail Nachrichten versendet.

 

Das PHP Skript wird mit <? eröffnet:

<?

 

Der Mailheader setzt sich aus der Art des Inhaltes,

 

                $mailheaders = "MIME-version: 1.0\n";

                $mailheaders .= "Content-Type: text/html\n";

 

dem Absender,

 

                $mailheaders .= "From: $absender\n";

                $mailheaders .= "Reply-To: $absender\n";

 

sowie der Nachricht zusammen.

 

                $message=stripslashes($nachricht);

 

Nun versendet die PHP Funktion mail die Nachricht unter Angabe der Nachrichtenüberschrift und des Empfängers.

 

                $success = mail ($empfaenger,"e-Mail from objectmentor.de",$message,$mailheaders);

               

Der Rückgabe Parameter $success ermöglicht die Auswertung des Erfolges bzw. Misserfolges des Mailversandes.

 

                if (success){

                               echo "<h1>Mailversand erfolgreich</h1>";

                }else{

                               echo "<h1>Mailversand gescheitert!</h1>";

                }

 

Die Beendigung des PHP Skripts erfolgt mit:

 

 ?>

 

Das entsprechendes Skript finden Sie im Listing 2.

 

Weitere Informationen zum Thema PHP finden Sie unter [PHP01].

 

Von XML mit XSL zur Nachricht

Der Aufbau eines XSL-Dokumentes beschreibt die exakte Verarbeitung des XML-Datencontainers in das gewünschte Zielformat. Das XSL Dokument gibt im Dokumentenkopf die Verarbeitungsmethoden an:

 

<?xml version='1.0'?>

<xsl:stylesheet

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    version="1.0"  

>

 

Das bedeutet für alle nachfolgenden XML Tags, dass der Namespace xsl über die Vorschriften für XSL des W3C von 1999 verarbeitet wird.

 

Im nächsten Schritt erfolgt die Beschreibung des Zielformates:

 

<xsl:output method='text' indent='no'/>

 

Die Ausgabemethode ist “text”. Daraus folgt, dass die XML Encoding – Anweisung in der Ausgabe unterdrückt wird. Außerdem soll keine automatische Einrückung erfolgen.

 

Im letzten Teil vor den eigentlichen Verarbeitungsvorschriften wird angegeben, welche Vorlage verwendet wird:

 

                <xsl:template match='/'>

                               <xsl:apply-templates select='/'/>

                </xsl:template>

 

In diesem Fall soll lediglich die Wurzelverarbeitungsvorschrift gelten. Es wäre denkbar, drei Verarbeitungsvorschriftenblöcke für den Absender, den Empfänger und die Mitteilung einzurichten.

 

Die Anweisung xsl:apply-templates select=’/’ löst die eigentliche Verarbeitung aus.

 

URL-Encoding mit XSL und Java

XSL bietet für die URL-Kodierung keine Funktionalität an. Aus diesem Grund wird die Java-Erweiterung des Xalans genutzt. Der erste Schritt ist die Bekanntgabe[A6]  der Java-Erweiterung im XSL Dokumentenkopf:

 

<xsl:stylesheet

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    version="1.0"  

    xmlns:java="http://xml.apache.org/xslt/java"

    exclude-result-prefixes="java">

 

Das Präfix java ist von der Ausgabe ausgeschlossen.

 

Im nächsten Schritt erfolgt die Zuweisung der Inhalte in „String“-Variablen, die mit Java verarbeitet werden sollen:

 

<xsl:variable name="mymobil" select="string(message/receiver/mobil)"/>

 

Im letzten Schritt findet die Verarbeitung der Variable statt. In diesem Fall erfolgt die Konvertierung der Variable in ein URL-codierten String. Hierfür findet [A7] die statische Methode „encode“ vom „URLEncoder“ aus dem Package „java.net“ Verwendung:

 

<xsl:value-of select='java:java.net.URLEncoder.encode($mymobil)'/>

 

Das Resultat erscheint am Ende der Verarbeitung in der Ausgabe.

 

Daraus ergeben sich folgende Beispiele:

 

Variable $mymobil:               +491771234567 

Ausgabe:                           %2B491771234567

 

oder

 

Variable: $mynachricht:        Alles wird gut

Ausgabe:                           Alles+wird+gut

 

Konditionale Anweisung in XSL

Durch die Anweisung <xsl:choose> erfolgt die Ausgabeverarbeitung abhängig zu bestimmten Werten innerhalb des XML Datencontainers[A8] . Im Fall des Listing 1 wäre eine solche Steuervariable, der Inhalt des Tags <prefered>. „prefered“ soll die Art der Nachrichtenversendung steuern. Also im Fall der SMS, erfolgt die Aufarbeitung der Nachricht für das Webinterface der Firma EDIS.AT und im Fall der e-Mail für das PHP Skript. Ein Rumpf für die konditionale Verarbeitung befindet sich im Listing 3.

 

Eine Nachricht mit XML und XSL via Java aufbereiten

Um XML Strukturen mit XSL zu verarbeiten wird ein XSLTProzessor benötigt. Dieser ist über eine entsprechende Builder [GOF96] erhältlich:

 

XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

 

Um die formatierte Ausgabe zu erhalten, ist es notwendig, diesen in einem entsprechenden Stream zu fangen, um ihn im Anschluss in einen String zu wandeln:

                            

ByteArrayOutputStream baos = new ByteArrayOutputStream();

                                                    

Um die Arbeitsweise des Programms dynamisch zu gestalten wird im ersten Argument der Argumentenübergabe der Dateiname der zu verarbeitenden XML Struktur angegeben und dieser in den ersten Parameter des Funktionsaufrufes verwendet. Der zweite Parameter des Aufrufs des XSLT Prozessors benötigt die Angabe des XSL Kodes für die Formatierung des XML Kodes. Der letzte Parameter gibt den Rückgabe-Stream der Verarbeitung an.

 

processor.process(               new XSLTInputSource(args[0]),

                                new XSLTInputSource("message.xsl"),

                               new XSLTResultTarget(baos));

                            

Am Ende wird der Rückgabe-Stream in einen String gewandelt:

 

String out = baos.toString();

 

 

Eine Nachricht versenden mit Java

Java bietet für die Versendung von http Anfragen im Package java.net die Klasse HttpURLConnection. Mit den folgenden Codefragment ist es möglich, eine http-Anfrage zu starten:

 

                               URL u = new URL(out);

                               HttpURLConnection uc = (HttpURLConnection) u.openConnection();

                               int code = uc.getResponseCode();

 

In der Variablen code befindet sich im Anschluss der Verarbeitung der http Rückgabewert. Dieser Wert zeigt an, ob die http Anfrage erfolgreich war oder nicht. Der Wert 404 zeigt dementsprechend den Misserfolg bzw. 200 die erfolgreiche Verarbeitung durch den Webserver an.

 

Allerdings gibt erst der Inhalt der zurückgegebenen HTML-Seite Aufschluss über den Status des Nachrichtenversandes.

 

Von der Variable uc des Types HttpURLConnection erhalten wir den InputStream, mit dem wir die HTML-Rückgabeseite unserer Verarbeitungsanfrage erhalten.

 

                                               InputStream in = new BufferedInputStream(uc.getInputStream());

                                               Reader r = new InputStreamReader(in);

 

Für diesen Artikel reicht die Ausgabe der HTML-Seite auf die Standardausgabe. Eine praktische Erweiterung wäre es die Rückgabeseite zu analysieren, um Rückschlüsse über den Nachrichtenversand zu erhalten und dementsprechend reagieren zu können.

 

                                               int c;

                                               while ((c=r.read()) != -1){

                                                               System.out.print((char)c);

                                               }

 

Die Umgebung

Um eine erfolgreiche Ausführung des Beispieles zu erhalten, muss der CLASSPATH in der Umgebung um die JAR Dateien des Xalan und des Xerces erweitert werden.

 

Windows-Umgebung:

set CLASSPATH=d:\apps\xalan\xalan.jar;d:\apps\xalan\xerces.jar;d:\apps\xalan\bsf.jar;%CLASSPATH&

 

UNIX Umgebung:

$ export CLASSPATH=/usr/java/lib/xalan/xalan.jar:/usr/java/lib/xalan/xerces.jar:/usr/java/lib/xalan\bsf.jar:$CLASSPATH

 

Das Finale

Zum Finale wird eine SMS mit dem erstellten Programm versendet. Hierfür erfolgt die Modifizierung der XML Struktur aus Listing 1 im <receiver> Tag als bevorzugte Versandart <prefered> auf sms.

Die Ausführung des Java Programm aus Listing 4 gestaltet sich wie folgt:

 

Eingabe:

 

H:\>java XmlMessageSender message-sms.xml

 

Ausgabe:

 

http://edis.at/sms.php3?id=XXXX&pw=XXXX&flash=0&dnr=%2B491771234567&snr=objectmentor&msg=Das+neue+Java-Magazin+ist+da%21

=>[200]=>OK

SMS an +491771234567 wurde gesendet.

 

Zusammenfassung

Dieser Artikel hat veranschaulicht, wie es mit einfachsten Mitteln möglich ist SMS und e-Mail aus einer Datenquelle zu versenden. Durch die Nutzung von XML und XSL sowie Internettechnologien reduziert sich der Aufwand für komplexe Aufgaben erheblich.

 

Referenzen & Links

 

[APACHE]   http://www.apache.org

[ERH00]        E.R. Harold, Java Network Programming 2nd Edition, O’Reilly, 2000

[KYF01]        Khun Yee Fung, XSLT Working with XML and HTML, Addison Wesley, 2001

[EDI01]         http://www.edis.at

[AXA01]      http://xml.apache.org/xalan

[AXE01]       http://xml.apache.org/xerces

[OBM01]      http://www.objectmentor.de/glossar

[GOF96]        Gamma, Helm, Johnson, Vlissides, Entwurfsmuster, Addision Wesley, 1996

[PHP01]        http://www.php.net

 


 

Glossar

 

Apache Software Foundation

Stiftung für die Orgranisation, Rechtsberatung und Finanzierung von Open-Source-Projekten [APACHE]

http

Hyper Text Transfer Protocol

MIME

Multipurpose Internet Mail Extension

Namespace

Namensraum

PDF

Portable Document File

Sheet

Blatt

SMS

Short Message System

SMSC

Short Message System Center

Style

Vorlage

Stylesheet

Vorlagenbeschreibung

URL

Unique Resource Locator

W3C

World Wide Web Consortium

WAP

Wireless Application Protocol

XML

eXtensible Markup Language

XSL

eXtensible Stylesheet Language

XSLT

eXtensible Systesheet Language Transformation

 


Listing 1: Die XML Nachricht

 

<?xml version="1.0"?>

<message>

                <receiver>

                               <prefered>sms</ prefered >

                               <email>erwin@mustermann.de</email>

                               <mobil>+491771234567</mobil>

                </receiver>

                <sender>

                               <name>objectmentor</name>

                               <email>info@objectmentor.de</email>

                </sender>

                <text>Das neue Java-Magazin ist da!</text>

</message>

 

 

Listing 2: Das PHP Skript zum Versenden von e-Mail Nachrichten

 

<?

                $mailheaders = "MIME-version: 1.0\n";

                $mailheaders .= "Content-Type: text/html\n";

                $mailheaders .= "From: $absender\n";

                $mailheaders .= "Reply-To: $absender\n";

 

                $message=stripslashes($nachricht);

               

                $success = mail ($empfaenger,"e-Mail from objectmentor.de",$message,$mailheaders);

               

                if (success){

                               echo "<h1>Mailversand erfolgreich</h1>";

                }else{

                                echo "<h1>Mailversand gescheitert!</h1>";

                }

 ?>

 

 

Listing 3: Rumpf für die konditionale Verarbeitung mit XSL

 

<xsl:choose>

<xsl:when test='message/receiver/type = "sms"'>

                              

                </xsl:when>

                <xsl:otherwise>

                              

</xsl:otherwise>

</xsl:choose>

 

Listing 4: Java – Programm zur Verarbeitung von XML und XSL und dem anschließenden Verand via HTTP

 

import java.net.*;

import java.io.*;

 

import org.apache.xalan.xslt.*;

 

 

public class XmlMessageSender{

 

                public static void main(String[] args){

                               try{

                              

                                               //--------- Nachricht aufbereiten

                              

                                               XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

                                              

                                               ByteArrayOutputStream baos = new ByteArrayOutputStream();

                                                                             

                                               processor.process(new XSLTInputSource(args[0]),

                                      new XSLTInputSource("message.xsl"),

                                                     new XSLTResultTarget(baos));

                                              

                                               String out = baos.toString();

               

                                               //--------- Nachricht versenden                         

               

                                               String myUrl = out.substring(0,out.indexOf('?'));

                                               String myQuery = out.substring(out.indexOf('?')+1);

                                               System.out.println("url: "+myUrl);

                                               URL u = new URL(out);

                                               HttpURLConnection uc = (HttpURLConnection) u.openConnection();

                                               int code = uc.getResponseCode();

                                               String response = uc.getResponseMessage();

                                               System.out.println("=>["+code+"]=>"+response);

                                              

                                               InputStream in = new BufferedInputStream(uc.getInputStream());

                                               Reader r = new InputStreamReader(in);

                                               int c;

                                               while ((c=r.read()) != -1){

                                                               System.out.print((char)c);

                                               }

                                              

                               }catch(Exception e){

                                               e.printStackTrace();

                               }

                }

}

 


 

Abbildung: SMS Versandablauf

 

Bildunterschrift: Der Versand einer SMS erfolgt via EDIS.AT SMSC

 

 

Abbildung: Ablaufschema

 

Bildunterschrift: Die Formatierung der XML Datei in eine e-Mail bzw. eine SMS erfolgt durch XSL.


 [A1]sind

 [A2]Wiederholung. Viuelleicht statt dessen Message

 [A3]aktiv: Der Kopf enthält die Art der Kodierung

 [A4]aktiv: Am Ende erfolgt der XML-konforme Abschluss ...

 [A5]aktiv

 [A6]aktiv

 [A7]aktiv Hierfür eignet sich ...

 [A8]aktiv Die Anweisung xy steuert ...