PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Kein Hexenwerk: SMS/MMS mit PHP versenden

with 14 comments

Ziemlich kompliziert? Ziemlich teuer? Ich zeige euch das Gegenteil an einem kurzen Beispiel.

Ohne hier Werbung machen zu wollen werde ich in meinem Beispiel die Schnittstellen von www.sms77.de nutzen. Es gibt da draußen hunderte andere Anbieter, die vielleicht besser oder günstiger sind. Falls ihr einen Favoriten habt, nur her damit. Ich habe vor Jahren ein Konto bei SMS77 eingerichtet und nutze es hier und da für wichtige SMS-Benachrichtigungen.

(Nein, dies ist kein Werbeposting, ich bekomme (leider) kein Geld dafür.)

Also, um Nachrichten ins Mobilfunknetz verschicken zu können benötigt man einen Zugang zum Mobilfunknetz. Da man sich eine solche Umgebung nicht selbst aufbauen möchte, nutzt man sogenannte SMS-Gateways. Diese Anbieter haben eine Infrastruktur, um auf verschiedenen Wegen Nachrichten in das Mobilfunknetz zu leiten. Das sind neben SMS auch MMS, Logos, Klingeltöne und Wap-Push-Nachrichten.

Jedes SMS-Gateway bietet verschiedene Schnittstellen, wo wir die Nachrichten einliefern können. Die beliebteste ist wohl die HTTP-API, es gibt aber auch ein Email2SMS-Gateway, man kann die Nachrichten auch via Desktop-Anwendung versenden oder mit Hilfe eines Java-Programms, das man sich auf dem Handy installiert. Andere Provider bieten auch SS7, SMPP, XML etc an. Also mehr als genug Möglichkeiten, seine Information auf den Weg zu bringen.

Die ersten beiden Möglichkeiten möchte ich hier aus PHP heraus vorstellen. Wenn wir eine SMS versenden möchten, gibt es da noch verschiedene Qualitätsstufen und Typen. Dazu gibt es ganz unten im Artikel eine Übersicht.

Zuerst wollen wir eine einfache SMS versenden. Wir wählen den Typ BasicPlus und die HTTP-API:

$text = 'Hallo Admin, der Cronjob um 17 Uhr ist wider Erwarten nicht gelaufen. Bitte nachgucken!';
$url = 'http://sms77.de/gateway/?' .
		'u=' . urlencode('phpgangsta') .
		'&p=' . urlencode('md5passworthier') .
		'&to=00491771234567' .
		'&text=' . urlencode($text) .
		'&type=basicplus';
// Zur Vorsicht lieber ein @ davor, damit im Fehlerfall
// und falscher php-config die URL nicht publiziert wird
$response = @file_get_contents($url);
// nun noch $response auswerten und Rückgabecode prüfen
if ($response == '100') {
	echo 'Alles wunderbar, SMS ist versendet worden';
} else {
	echo 'Ein Fehler ist aufgetreten: '.$response;
}

Nun möchten wir eine Quality-SMS versenden. Diese soll zeitversetzt morgen früh um 3:00 versendet werden. Wir werden hier eine verschlüsselte Verbindung zu SMS77 aufbauen, einen Absender werden wir auch festlegen. Zu guter Letzt prüfen wir noch den Status der SMS:

$text = 'Hallo Admin, ab ins Bett, es ist 3 Uhr!';
$url = 'https://sms77.de/gateway/?' .
		'u=' . urlencode('phpgangsta') .
		'&p=' . urlencode('md5passworthier') .
		'&to=00491771234567' .
		'&text=' . urlencode($text) .
		'&type=quality' .
		'&status=1' .
		'&delay=' . strtotime('29.01.2010 3:00:00') .
		'&from=' . urlencode('PHPGangsta');
// Zur Vorsicht lieber ein @ davor, damit im Fehlerfall
// und falscher php-config die URL nicht publiziert wird
$response = @file_get_contents($url);
// nun noch $response auswerten und Rückgabecode prüfen
$responseData = explode("\n", $response);
if ($responseData[0] == '100') {
	echo 'Alles wunderbar, SMS ist versendet worden, die
			Msg-ID ist '.$responseData[1]."\n";
	sleep(10);
	$url = 'https://gateway.sms77.de/status.php?' .
		'u=' . urlencode('phpgangsta') .
		'&p=' . urlencode('md5passworthier') .
		'&msg_id=' . $responseData[1];
	$statusResponseData = @file_get_contents($url);
	$statusResponse = explode("\n", $statusResponseData);
	echo 'Status ist: ' . $statusResponse[0] .
			' um ' . date('d.m.Y H:i:s', $statusResponse[1]);

} else {
	echo 'Ein Fehler ist aufgetreten: '.$response;
}

Als Absender kann man eine Zeichenkette (bis 11 Zeichen) wählen oder eine Rufnummer. Des weiteren erhalten wir nun eine zweizeilige Antwort (durch status=1 ausgelöst), und zwar den ReturnCode und eine Message-ID, die wir dann zum Beispiel nutzen können, um den Status abzufragen.

Dies ist nur ein kurzer Beispielcode, in einem Produktivsystem sollte man das ganze natürlich noch etwas ausbauen, beispielsweise werden Verbindungsprobleme nicht abgefangen, und auch den Status sollte man in einer Schleife prüfen falls die SMS ein paar Sekunden länger benötigt.

Weitere Details findet man bei SMS77 in der API-Beschreibung. Darin stehen auch Einzelheiten zu Logos, Klingeltönen, MMS usw.

Nun noch schnell die Email-Schnittstelle an einem Beispiel erklärt:

include 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

$mail = new Zend_Mail('UTF-8');
$mail->setFrom('absender@phpgangsta.de')
	->addTo('email2sms@sms77.de')
	->setSubject('Hey Admin, Deine Webseite ist tot!')
	->setBodyText('email2smsKey#00491771234567#basicplus');

$config = array(
	'auth' => 'login',
	'username' => 'smtpusername',
	'password' => 'smtppasswort'
);
$transport = new Zend_Mail_Transport_Smtp('smtp.provider.de', $config);
// alternativ kann natürlich auch die gute alte mail() Funktion genutzt werden
// $transport = new Zend_Mail_Transport_Sendmail();
$mail->send($transport);

Es ist also nur eine normale Email mit bestimmten Angaben im BodyText, und schon kommt die SMS Sekunden später auf dem Handy an.

Das sind nur die Basics, es gibt noch viele weitere interessante Möglichkeiten, wie beispielsweise Inbound-SMS (SMS-Empfang, 3 Keywords bekommt man kostenlos), SMS-Daueraufträge, FreeSMS, Adressbuch (Automatische Geburtstags-SMS, oder statt Nummer einfach den Namen angeben beim Versenden) und einigem mehr.

Die Preise bewegen sich derzeit bei 3,5 Cent für eine BasicPlus-SMS und 7,9 Cent für eine Quality-SMS. Preise für Festnetz-SMS, MMS etc. entnimmt man der Webseite von SMS77.

Einfach mal ausprobieren, es gibt keine Einrichtungsgebühr, kein Mindestumsatz oder sonstwas, 2 Euro draufladen und Spass haben!

—————–

SMS77 unterscheidet zwischen

  • BasicPlus SMS: SMS wird über innerdeutsche Routen verschickt, Absenderadresse ist die Gatewayadresse von SMS77. Der Empfänger kann antworten, die Antwort ist bei SMS77 einsehbar (also eine anonyme Kommunikation)
  • Quality SMS: Man kann eine beliebige Absender-Nummer angeben. Damit könnte man eine falsche Nummer angeben, oder jedoch seine richtige Nummer, damit die Antwort auf dem eigenen Handy ankommt.
  • Flash SMS: Die meisten neuen Handys unterstützten diesen Typ. Die SMS wird direkt auf dem Bildschirm angezeigt, sie muss nicht erst geöffnet werden.
  • Festnetz SMS: Die SMS wird ins Festnetz verschickt und dort dann vorgelesen.

Written by Michael Kliewe

Januar 28th, 2010 at 9:21 am

Posted in PHP

Tagged with , , ,

14 Responses to 'Kein Hexenwerk: SMS/MMS mit PHP versenden'

Subscribe to comments with RSS or TrackBack to 'Kein Hexenwerk: SMS/MMS mit PHP versenden'.

  1. Hallo Michael,

    ich kann noch mobilant.de empfehlen.

    Der Versand ist schnell und kostengünstig. Einfache SMS ohne Absenderkennung kosten 3 Cent, mit Absenderkennung 6,9 Cent. Es gibt auch noch Low-Cost Alternativen über auslandische Carrier zur Auswahl (2,5 und 4,9 Cent), falls man zeitlich unkritische Infos verschicken und sparen will 😉 Natürlich auch hier kein Mindestumsatz, keine Vertragsbindung, etc. Für PHP gibt’s fertige Demo-Scripte, so dass auch Einsteiger damit zurecht kommen.

    Ich nutze das Gateway für’s Server-Monitoring und habe zum Glück noch nicht all zu viele SMS empfangen müssen 😉

    Gruß,
    Dominik

    Dominik

    28 Jan 10 at 12:08

  2. Die hatte ich mir damals auch angesehen, ist einer der Bekanntesten und größten deutschen Anbieter, aber leider nicht für Privatleute:

    Mobilant richtet sich ausschließlich an Geschäftskunden, alle Preise sind Netto zzgl. Mehrwertsteuer zu verstehen.

    Michael Kliewe

    28 Jan 10 at 12:43

  3. Die Anmeldung ist auch als Privatperson möglich und das Feld „Firma“ ist bei der Anmeldung optional. Ich bin privat angemeldet, weil es meine Firma damals noch nicht gab … ich hake aber auch nochmal per Mail nach ob sich das geändert hat und nur noch Firmen angenommen werden.

    Dominik

    28 Jan 10 at 13:11

  4. Dann sollen sie auch gleich die FAQ ändern, daraus habe ich den Satz.

    Michael Kliewe

    28 Jan 10 at 13:49

  5. Bin bei Brutus: werbe-sms.eu

    Ziemlich schnell und sicher, nur die Incoming Schnittstelle ist nicht sehr glohrreich.

    SMS77 habe ich vorher probiert – schrecklicher Support.

    Xerxes

    28 Jan 10 at 13:59

  6. Für Geschäftkunden ist auch der Gateway von Lox24 eine günstige Alternative und Privatkunden können auf http://www.sloono.de zurückgreifen. Die Schnittstelle ist nicht identisch, aber immerhin sehr ähnlich, da beide auch einen HTTP Request einsetzen.

    SMS Gateway

    29 Jan 10 at 10:51

  7. Für Benachrichtigungen von Monitoring-Systemen würde ich nicht auf SMS-Gateways setzen. Sollte es Probleme mit dem Netz geben siehts dann nämlich schlecht aus. Hat man den Luxus mit eigener Hardware zu arbeiten oder an gemietete Hardware „Accessoirs“ hängen zu dürfen bietet es sich ein ein Altes Handy an die serielle oder USB-Schnittstelle zu hängen und beispielsweise mit gnokii (http://www.gnokii.org/) SMS zu verschicken.

    Zoran Zaric

    31 Jan 10 at 21:10

  8. […] PHP Gangsta erklärt, wie man einfach und kostengünstig SMS und MMS mit PHP versenden […]

  9. […] Kein Hexenwerk: SMS/MMS mit PHP versenden | PHP Gangsta – Der PHP Blog […]

  10. […] Kein Hexenwerk: SMS/MMS mit PHP versenden | PHP Gangsta – Der PHP Blog […]

  11. […] – Die wunderbare Welt von Isotopp Web 2.0 Sammelalbum – Web2Null – Chatpast Kein Hexenwerk: SMS/MMS mit PHP versenden | PHP Gangsta – Der PHP Blog Simple private real-time sharing and collaboration by drop.io WordPress: Administratoransicht: Die […]

  12. Also ich bin seit Jahren sehr zufrieden mit http://www.fullsms.de – keinerlei Probleme und auch günstige Preise. Versand ist auch per Mail to SMS oder eben über die HTTP-Schnittstelle möglich.

    Eike

    20 Okt 12 at 13:44

  13. Ich bin seit 2 Jahren bei easyonline.de
    SMS mit Absenderkennung für 3,5 und ohne Absenderkennung für 1,5 cent. Kommen binnen 10 Sekunden ab und können auch russische Zeichen ohne Probleme.

    Borbarad

    17 Sep 14 at 15:15

  14. Ich habe Dein script benutzt aber leider funktionieren die Deutschen Umlaute nicht. Kann es sein das es daran liegt das mein Server in den USA ist?

    Thomas Herold

    21 Mrz 17 at 08:58

Leave a Reply

You can add images to your comment by clicking here.