SMS versenden in .NET
Geschrieben von: Christoph Wille Ein äußerst beliebtes Handyfeature ist heutzutage die SMS, oder in der Langform das Short Message System. Es gibt viele Websites am Netz, von wo aus man seine SMS gratis abschicken kann - meist Werbung mitinkludiert. Heute möchte ich vorstellen, wie man SMS selbst versenden kann, und zwar mit Hilfe verschiedener Framework Klassen. Auch unter .NET geht es ohne einen Gateway (Internet zu GSM) nicht. Und wenn man einen zuverlässigen haben will, dann muß man dafür bezahlen. Ich habe mich für sms-wap.com entschieden, und wenn man sich anmeldet, bekommt man drei Test-SMS gratis dazu - bevor man irgendetwas zahlen muß. Also probieren kostet im Prinzip nichts. Es gibt unter SMS Delivery Interfaces die notwendige Dokumentation, wie man das HTTP Application Interface ansprechen kann. Wer es sich durchlesen will, der möge es tun - ich finde es etwas überzogen, für HTTP direkt mit Sockets zu programmieren. Deshalb habe ich für den heutigen Artikel den direkten Weg eingeschlagen: das WebRequest Objekt. Das gesamte Versenden einer SMS läuft über die Seite http://clients.sms-wap.com/cgi/csend.cgi, der man einige Parameter via POST übergeben muß: klarerweise die eigenen Accountdaten (Benutzername und Passwort), die Zielhandynummer sowie die Nachricht. Wie gehen wir also vor? Nun, die Grundlagen haben wir bereits im Artikel Scrapen von Webseiten gelernt, allerdings haben wir dort keine (POST) Daten vom Client zum Server geschickt. Um diesen Part müssen wir unsere Implementation erweitern. Weil ich gerade von Implementation rede: es spielt sich alles in der Klasse SMSGateway ab, und obwohl das Beispiel heute eine Kommandozeilenapplikation ist, kann man die Klasse in beliebigen anderen Anwendungstypen verwenden. Nun zum Code der Klasse, der hauptsächlich in der Methode SendMessage zu finden ist: class SMSGateway { public string Username; public string Password; public bool SendMessage(string strMessage, string strTelNoTo, out string strResponse) { string strQuery, strPage; strQuery = "N=" + HttpUtility.UrlEncode(strTelNoTo) + "&UID=" + HttpUtility.UrlEncode(Username) + "&PW=" + HttpUtility.UrlEncode(Password) + "&M=|*UTF8|" + HttpUtility.UrlEncode(strMessage); strPage = "http://clients.sms-wap.com/cgi/csend.cgi"; try { WebRequest wrq = WebRequest.Create(strPage); wrq.Method = "POST"; wrq.ContentType = "application/x-www-form-urlencoded"; byte[] bPayload = Encoding.UTF8.GetBytes(strQuery.ToString()); wrq.ContentLength = bPayload.Length; Stream reqStream = wrq.GetRequestStream(); reqStream.Write(bPayload, 0, bPayload.Length); reqStream.Close(); WebResponse wrp = wrq.GetResponse(); StreamReader sr = new StreamReader(wrp.GetResponseStream(), Encoding.UTF8); StringBuilder strBuildContent = new StringBuilder(); while (-1 != sr.Peek()) strBuildContent.Append(sr.ReadLine()); strResponse = strBuildContent.ToString(); if ("01" == strResponse) return true; } catch(Exception e) { strResponse = e.ToString(); return false; } return false; } } Was sind die wichtigen Parts? Der erste ist das Erzeugen der Variable strQuery, die die POST Daten repräsentiert. GET als auch POST Daten müssen URL-encoded werden, und diese Arbeit geben wir an die HttpUtility.UrlEncode Methode ab (deren Verwendung ist nicht an ASP.NET Anwendungen gebunden). Ebenfalls sehr wichtig ist bei M= der Part |*UTF8| - ohne diese Angabe bekommen wir beim SMS Gateway Probleme mit den Sonderzeichen. Es folgt der Code zum Senden der Daten an den Server, und das Abholen der Rückgabewerte. Kein Magic, aber notwendig. Ein Rückgabewert von 01 repräsentiert OK, also die SMS wurde korrekt gesendet. Alles andere ist Mißerfolg. Um ganz auf der sicheren Seite zu sein, liefert die Funktion nicht nur true oder false, sondern für alle Fälle auch den vollen (Fehler)Text. Wie verwendet man nun diese Klasse? Hier der Code einer simplen Consolenanwendung, aber ASP.NET würde genauso funktionieren: class MainClass { public static void Main(string[] args) { SMSGateway mySMS = new SMSGateway(); mySMS.Username = "username_here"; mySMS.Password = "password_here"; string strResponse; bool bResult = mySMS.SendMessage("Melcome Sir Walcom [Water]", "4369929675231", out strResponse); Console.WriteLine("Sending SMS, status: {0}, response: {1}", bResult, strResponse); } } Ich habe mir erlaubt, meinen Benutzernamen und Passwort herauszunehmen... SchlußbemerkungDie Klasse zum Versenden von SMS ist nun fertig. Spätere Artikel werden diese Klasse dann einsetzen, um spezielle Services für Handys anzubieten. Übrigens: den Film Water kann ich nur sehr empfehlen. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Scrapen von Webseiten Links zu anderen Sites
SMS Delivery Interfaces Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |