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