PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘SMS77’ tag

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