Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke

Ausprobiert: SMS Versand per Email, SMS Versand per Webseite, SMS Email benachrichtigung....

Ich wollte ein SMS Gateway haben - also ich schicke eine email mit einem bestimmten Betreff und das ganze wird dann als SMS Versand. Wenn ich schon mal dabei war, wollte ich auch eine SMS per Webseite versenden und über eingehende SMS bei "Gammu" per email informiert werden...

So kompliziert ist das eigentlich gar nicht..., aber es müssen verschiedene Vorraussetzungen erfüllt sein:

Euer "Gammu" muss schon lauffähig installiert sein und der Stick sollte auch mitarbeiten..., wie das geht steht hier. Weiterhin muss Apache und PHP aktiviert sein.

Damit PHP auch Zugriff auf die alten SMS Nachrichten hat, mussten die Pfade auf den www Bereich gelegt werden, und zwar in den "sms" Unterordner, die wir wie folgt anlegen:

sudo mkdir /var/www/sms

sudo mkdir /var/www/sms/inbox

sudo mkdir /var/www/sms/outbox

sudo mkdir /var/www/sms/sent

sudo mkdir /var/www/sms/error

sudo chmod -R 0777 /var/www/

Ansonsten muss die Gammu konfiguration im Terminal etwas angepasst werden:

sudo nano /etc/gammu-smsdrc

und dort passen wir die Pfade auch noch etwas an:

# Configuration file for Gammu SMS Daemon

# Gammu library configuration, see gammurc(5)
[gammu]
# Please configure this!
port = /dev/ttyUSB0

connection = at
# Debugging
logformat = textalldate

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
pin = 1234
service = files
# logfile = syslog
# Increase for debugging information
# debuglevel = 4
# ReceiveFrequency = 300

# Paths where messages are stored
inboxpath = /var/www/sms/inbox/
outboxpath = /var/www/sms/outbox/
sentsmspath = /var/www/sms/sent/
errorsmspath = /var/www/sms/error/

Damit der User "www-data" auch SMS Versenden kann braucht das Programm "gammu-smsd-inject" auch mehr rechte:

sudo chmod 0777 /usr/bin/gammu-smsd-inject

Jetzt sollte man nach einem Neustart mittels "sudo reboot" weiterhin SMS Versenden können. Wenn das alles klappt ist das Grundgerüst für unser Gateway vorhanden.

 

SMS Versand per Webseite:

Den Anfang macht die Datei:/var/www/sms/SendSMS.php

<?php
//Variablen abfragen
$Empfaenger= $_GET['nummer'];
$Text= $_GET['text'];
$error="0";
//Eines der Felder leer, dann abbruch
if ($Empfaenger==false) {echo "Fehler: Empfaengernummer fehlt"; $error="1"; }
if ($Text==false) {echo "<br>Fehler: SMS Text fehlt";$error="1";}
if ($error=="1") {echo "<br><br>Syntax: SendSMS.php?nummer=123445678&text=Dies ist ein Testtext";exit;}

exec( 'echo "'.$Text.'" | gammu-smsd-inject TEXT "'.$Empfaenger.'"');

?>

Wenn man diese Datei aufruft: z.b. http://192.168.0.55/sms/SendSMS.php bekommt man den Syntax angezeigt.

Eine SMS Versendet man dann so :

http://192.168.0.55/sms/SendSMS.php?nummer=1223837438&text=Dies ist eine SMS

 

SMS Versand per Email:

Die Datei /var/www/sms/mail2SMS.php

<?php
//Angaben für das Email Postfach
$server='{imap.gmx.de:993/imap/notls/ssl/novalidate-cert}INBOX';
$adresse='A.Teichmann@NOSPAMgmx.net'; //Email Adresse
$password='Passwort'; //Email Passwort

//Suchmuster für SMS versand, das Suchmuster MUSS am Anfang der Email vorkommen, damit ein SMS Versand stattfindeb kann.
$suchmuster="Send:";

//Syntax;
//Betreff: Send:004916312347875745 Text der SMS

//Zeitraum der Mailabfrage in Sekunden
$zeitraum="60"; //entspricht 60 Sekunden, also 1 Minute

//Aktuelles Datum
$ay = date("Y");
$am = date("m");
$ad = date("d");
//Aktuelle Uhrzeit
$ahour = date("H");
$amin = date("i");
$asec = date("s");
$atimestamp = mktime($ahour,$amin,$asec,$am,$ad,$ay)-$zeitraum;

//Postfach nur zum Lesen öffnen
$imap = imap_open($server, $adresse, $password, OP_READONLY);

//iMap Headers holen und die Anzahl der vorhandenen Mails ermitteln
$headers = imap_headers($imap); $i=count($headers); $anzahl=1;

//Mails nacheinander einlesen und prüfen ob Zeitraum und Suchmuster passt
do {
$header = imap_header($imap, $i);

//Datum der Mail feststellen
$y = date("Y", $header->udate);$m = date("m", $header->udate);$d = date("d", $header->udate);
//Uhrzeit der Mail feststellen
$hour = date("H", $header->udate);$min = date("i", $header->udate);$sec = date("s", $header->udate);
//Zeitstempel erzeugen
$timestamp = mktime($hour,$min,$sec,$m,$d,$y);
//Zeitstempel mit aktuellem Zeitstempel minus Zeitraum überprüfen
if ($timestamp>=$atimestamp) {

//Sollte die Mail in den letzten x Minuten angekommen sein, dann verarbeite den Inhalt
//Betreff Extrahieren & anpassen
$betreff = $header->subject; $betreff=decode_imap_text($betreff);

//Prüfen ob Suchmuster im Betreff vorkommt
if($betreff!=str_replace($suchmuster,"",$betreff)) {
//Nummer extrahieren
$needle=str_replace($suchmuster,"",$betreff);
$pos=strpos($needle," ");if ($pos==true) {
$nummer=substr($needle,0,$pos);$needle=str_replace($nummer,"",$needle);
$text=trim($needle);

//Versand der SMS
$script= 'echo "'.$text.'" | gammu-smsd-inject TEXT "'.$nummer.'"';
exec($script);

}
}}
$i=$i-1;
} while($i>$anzahl);

//Postfach wieder Schließen
imap_close($imap);

exit;

 

function decode_imap_text($var){
$text = '';
$decode_header = imap_mime_header_decode($var);
foreach ($decode_header AS $obj) {
$text .= htmlspecialchars(rtrim($obj->text, "\t"));
}
return $text;
}

?>

Diese Datei muss über einen Cronjob alle 60 Sekunden aufgerufen werden, man kann das aber auch z.b. auf alle 5 Minuten hochsetzen, dann wird eine SMS aber nur alle 5 Minuten Versand.

Was macht das Script ?

Es loggt sich Readonly per Imap in euer Email konto ein, überprüft die letzen "60" Sekunden ob da eine Email eingegangen ist wo der Betreff mit "Send:" anfängt. Sollte eine Mail mit dem Betreff "Send:" anfangen, wird die Nummer dahinter genommen, und der Text der anschließend kommt als SMS Text Verwendet. Das wird dann an Gammu als SMS weitergegeben und Gammu versendet dann das ganze als SMS.

Der Betreff sieht also so aus: Send:0049163298329832 Dies ist eine Email SMS Weiterleitung

So kann man von JEDEM Email Konto aus eine SMS Versenden. Man kann es auch auf bestimmte Absender limitieren, aber das muss jeder selber wissen.

Der passende Cronjob dazu wird vom Terminal mittels "sudo crontab -e" eingerichtet: Die IP des RPi muss natürlich angepasst werden.

* * * * * /usr/bin/curl 192.168.0.55/sms/mail2SMS.php >/dev/null 2>&1

Wollt ihr nur alle 5 Minuten einen Mail2SMS Versand haben, müsst ihr zum einem in dem Script die 60 durch eine 300 ersetzen (300 Sekunden) und den Cronjob auch auf 5 Minuten anpassen:

*/5 * * * * /usr/bin/curl 192.168.0.55/sms/mail2SMS.php >/dev/null 2>&1

 

Email benachrichtigung bei eingehenden SMS:

Es ist zwar toll wenn man SMS Versenden kann, aber was ist wenn man welche bekommt ? Sollen die in den Tiefen des Raspberry Pis versauern ? Natürlich kann man sich auch über eingehende SMS per Email Informieren lassen.

Dafür brauchen wir die Datei:/var/www/sms/SMS2mail_check.php

<?php
$inbox = "inbox/";
$outbox = "outbox/";
$sentsms = "sent/";
$errorsms = "error/";

$email="A.Teichmann@NOSPAMgmx.net";
$Absender_Email="A.Teichmann@NOSPAMgmx.net";
$Absender_Name="Axel Teichmann";

//ERROR HANDLING - Alle fehlerhaften SMS an die Email weiterleiten.
$ordner=$errorsms;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {
//Infos aus dem Dateinamen auslesen
$datum =substr($file,10,2).".".substr($file,8,2).".".substr($file,4,4);
$uhrzeit =substr($file,13,2).":".substr($file,15,2).":".substr($file,17,2);
$vonNummer =substr($file,23);$pos=strpos($vonNummer,"_");$vonNummer=substr($vonNummer,0,$pos);
//Weitere Infos aus der Datei auslesen
$inhalt= implode('', file($ordner."".$file));
$start=strpos($inhalt,"SMSBackup");$ende=strpos($inhalt,'PDU = Submit',$start);
$sms =substr(substr($inhalt,$start,($ende-$start)),15);
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung: FEHLER";
$nachricht = "SMS Fehler - Nachricht konnte nicht gesendet werden<br>Empfänger : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Inhalt : ".$sms;

$optheader[] = "From: Kurzmitteilung <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Fehler
unlink($ordner."".$file);

}} else {echo "keine ERROR Nachrichten<br>";}

 

 

 

//SENT HANDLING - Gesendete SMS als Email weiterleiten
$ordner=$sentsms;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {
//Infos aus dem Dateinamen auslesen
$datum =substr($file,10,2).".".substr($file,8,2).".".substr($file,4,4);
$uhrzeit =substr($file,13,2).":".substr($file,15,2).":".substr($file,17,2);
$vonNummer =substr($file,23);$pos=strpos($vonNummer,"_");$vonNummer=substr($vonNummer,0,$pos);
//Weitere Infos aus der Datei auslesen
$inhalt= implode('', file($ordner."".$file));
$start=strpos($inhalt,"SMSBackup");$ende=strpos($inhalt,'PDU = Submit',$start);
$sms =substr(substr($inhalt,$start,($ende-$start)),15);
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung erfolgreich versendet";
$nachricht = "Folgende SMS wurde erfolgreich versendet<br>Empfänger : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Inhalt : <br>".$sms;

$optheader[] = "From: Kurzmitteilung <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Fehler
unlink($ordner."".$file);

}} else {echo "keine gesendeten Nachrichten<br>";}

 

 

 

 

//INBOX HANDLING - Alle Eingehenden SMS an die Email weiterleiten.
$ordner=$inbox;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {
//Infos aus dem Dateinamen auslesen
$datum =substr($file,8,2).".".substr($file,6,2).".".substr($file,2,4);
$uhrzeit =substr($file,11,2).":".substr($file,13,2).":".substr($file,15,2);
$vonNummer =substr($file,21);$pos=strpos($vonNummer,"_");$vonNummer=substr($vonNummer,0,$pos);
//Weitere Infos aus der Datei auslesen
$sms= implode('', file($ordner."".$file));
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung Empfangen";
$nachricht = "Eine neue SMS<br>Von : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Nachricht : <br>".$sms;

$optheader[] = "From: ".$vonNummer." <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Fehler
unlink($ordner."".$file);

}} else {echo "keine INBOX Nachrichten";}

?>

 

Wenn man diese Datei aufruft: z.b. http://192.168.0.55/sms/SMS2mail_check.php arbeitet das Script die Gammu Ordner ab:

Error, inbox, sent

Sollte sich darin eine Nachricht befinden, wird diese per Mail Versendet und anschließend bei Gammu gelöscht. So bekommt man bei Fehlerhaften Versand genau so eine Email als wenn man es erfolgreich versendet hat oder eine SMS bekommt.

Damit das ganze auch dauerhaft überwacht wird muss das ganze natürlich in einen Cronjob mittels "sudo crontab -e", hier als beispiel it der IP 192.168.0.55 und aufruf alle 5 Minuten.

*/5 * * * * /usr/bin/curl 192.168.0.55/sms/SMS2mail_check.php>/dev/null 2>&1
Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke