Aktion ausführen bei E-Mail - smstools

bimmi
IPC Neuling
Beiträge: 31
Registriert: Fr 2. Nov 2012, 01:44
Kontaktdaten:

Aktion ausführen bei E-Mail - smstools

Beitrag von bimmi »

Hi Jungs,

sorry dass ich sowas hier poste, aber ich weiß das es hier wirklich gute Linuxkenner gibt. Ich habe folgendes vor mit meinem Pi:

Ich würde gerne einen SMS Gateway einrichten.

Ich weiß wie man einen Surfstick einrichtet und wie man ihn anspricht. Mein Problem ist es ich muss das ganze von einer Webseite aus steuern. Der Webserver ist gehostet und nicht Lokal. Das ganze würde ich mit den SMStools lösen.

Das ganze wird über ein E-Mail-Formular gelöst. Sprich Text und Name ausfüllen und auf "senden". Die E-Mail sieht so aus.

Code: Alles auswählen

To: 0000000000 1111111111 222222222 333333333 444444444 55555555

Nachricht - Benutzername
Das ganze mit dem Formular funktioniert auch schon. Nur bekomme ich den Pi nicht dazu eine E-Mail abzurufen, den Text dann in ein eine Datei zu speichern in ein spezielles Verzeichnis (etc/sms/outbox/sms.txt).

Mit was kann ich beim Pi eine E-Mail abrufen? Mit getmail? OK. Aber wie sag ich ihm dass er nur den reinen Inhalt der E-Mail speichern soll?

Kann mir jemand helfen?

Schritt für Schritt:

1. Login auf Webseite
2. Formular ausfüllen (ohne Nummern)
3. Formular wird abgesendet (Nummern stehen in einem hiddenfield)
4. Das Formular kommt per E-Mail an sms@domain.de
5. Raspberry holt die E-Mails ab (cronjob)
6. Falls eine E-Mail kommt, liest er die E-Mail und speichert den Inhalt in etc/sms/outbox/sms.txt ab
7. Wenn die SMS erfolgreich versendet wurde, soll er die sms.txt wieder löschen

Bei mir scheiterts schon am E-Mail abholen -.-

Vielleicht hat jemand einen Tip für mich?

Gruß bimmi
Raspberry Pi B 512er Modell mit IPC natürlich. Was sonst... :) Und der rennt und rennt und rennt...
Benutzeravatar
jensebub
IPC Meister
Beiträge: 1133
Registriert: So 1. Mai 2011, 09:34
Been thanked: 1 time
Kontaktdaten:

Re: Aktion ausführen bei E-Mail - smstools

Beitrag von jensebub »

Hallo bimmi,
ist zwar nicht mein spezialgebiet, aber ich denke zu punkt "6" kann ich eine php-funktion anbieten :P
http://de3.php.net/manual/de/function.fopen.php
http://de3.php.net/manual/de/function.fgets.php
http://de3.php.net/manual/de/function.fclose.php

Ich denke, erstmal genug stoff ;)

Gruß
jensebub
bimmi
IPC Neuling
Beiträge: 31
Registriert: Fr 2. Nov 2012, 01:44
Kontaktdaten:

Re: Aktion ausführen bei E-Mail - smstools

Beitrag von bimmi »

So. Hier bin ich wieder :)

Vorneweg: Wenn auch spät, aber trotzdem erst mal danke Jensebub. Ich habe wirklich keine Ahnung von PHP oder Linux. Das was ich kann hab ich mir abgeschaut und oder testen testen testen und learning by doing.

Ich bin jetzt soweit:

1. Ich habe mir ein kleines bash script geschrieben (wirklich klein), welches ein python script ausführt, was mir die E-Mails abholt. Dann den Inhalt in eine Datei schreibt und dann aus der Datei die passende Zeile raussucht die ich brauche.

Das sieht jetzt so aus:

Code: Alles auswählen

#!/bin/bash

#emails abholen und inhalt in email.txt schreiben
python /root/email.py>/tmp/email.txt

#Telefonnummern hinzufügen in sms.txt
echo To: 0000000, 111111111, 22222222222, 333333333, 444444444 >/tmp/sms.txt

#email.txt durchsuchen nach Stichwort (letzte zuerst)
grep "Nachricht:" /tmp/email.txt | tail -1 >>/tmp/sms.txt

#In Postausgang schieben
mv /tmp/sms.txt /var/spool/sms/outgoing/sms1.txt

#Dateien löschen:
rm /tmp/email.txt
#rm /tmp/sms.txt

exit 0

Pythonscript email.py

Code: Alles auswählen

import poplib

#config
user = 'postfachuser'
pop_server = 'mailserver.de'
password = 'passwort'

#script 
Mailbox = poplib.POP3_SSL(pop_server, '995')
Mailbox.user(user)
Mailbox.pass_(password)
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
	for msg in Mailbox.retr(i + 1)[1]: 
		print msg
Mailbox.quit()
das sh script würde ich jetzt in crontab eintragen und alle 5-10 min durchführen.

Insofern funktioniert das auch schon, jedoch hab ich folgende Probleme und auch wenn Ihr euch mit python und/oder den smstools nicht auskennt. Im bashscripting aber ganz sicher.

1. Wenn jemand zwei Sms hintereinander verschickt in der crontab Zeitspanne, werden die Datein überschrieben. Welche Parameter muss ich setzen damit er mir dann eine email2.txt und sms2.txt erstellt?

Oder ist das nicht lösbar?

Edit: Ich könnte das auch direkt über die komandozeile ausführen mit sendsms 491721234567 'Hello, how are you'. Jedoch funktioniert das ganze nur mit einer Nummer. Ich brauche aber mehrere Nummern. Somit würde es sich doch empfehlen, sendsms hintereinander aufzurufen.

Code: Alles auswählen

sendsms nummer1 'gleicher Nachrichtentext'
sendsms nummer2 'gleicher Nachrichtentext'
sendsms nummer3 'gleicher Nachrichtentext'
sendsms nummer4 'gleicher Nachrichtentext'
sendsms nummer5 'gleicher Nachrichtentext'
Sprich als script würde das jetzt so aussehen:

Code: Alles auswählen

#!/bin/bash

Nummer1="00000000000"
Nummer2="11111111111"
Nummer3="22222222222"

#emails abholen
python /root/email.py >/tmp/email.txt

#Dateien durchsuchen
#echo To: 0000000, 111111111, 22222222222, 333333333, 444444444 >/tmp/sms.txt
grep "Nachricht:" /tmp/email.txt | tail -1 >>/tmp/sms.txt

#SMS senden:
sendsms $Nummer1 'Nachrichtenausschnitt aus der E-Mail'
sendsms $Nummer2 'Nachrichtenausschnitt aus der E-Mail'
sendsms $Nummer3 'Nachrichtenausschnitt aus der E-Mail'

#In Postausgang schieben
#mv /tmp/sms.txt /var/spool/sms/outgoing/sms1.txt

#Dateien loeschen:
rm /tmp/email.txt
#rm /tmp/sms.txt

exit 0
Das wäre denk ich mal die klügere Lösung als den SMSDaemon laufen zu lassen...

Woran es da allerdings happert ist wie bekomme ich den Nachrichtentext der ja Variabel ist in die Zeile 'Nachrichtenausschnitt aus der E-Mail'

Vielleicht hat jemand die Muße und kann mir ein kleines bisschen unter die Arme greifen :) :)

Edit2:

Nach etwas googlen hab ich das hier gefunden, was eventuell hilft für MEHRFACHE EMPFÄNGER, nur ist mir das um einziges zu hoch... :(

Code: Alles auswählen

#!/bin/bash

# Sample script to allow multiple recipients in one message file.
# Define this script as a checkhandler.

outgoing="/var/spool/sms/outgoing"

recipients=`formail -zx "To:" < "$1"`

#count=`echo "$recipients" | wc -l`
count=`echo "$recipients" | wc -w`
if [ $count -gt 1 ]; then

  # Will need echo which accepts -n argument:
  ECHO=echo
  case `uname` in
    SunOS)
      ECHO=/usr/ucb/echo
      ;;
  esac

  messagebody=`sed -e '1,/^$/ d' < "$1"`
  headers=`formail -X "" -I "To:" -f < "$1"`

  for recipient in $recipients
  do
    file=`mktemp $outgoing/send_XXXXXX`
    $ECHO "To: $recipient" > $file
    if [ "x$headers" != "x" ]; then
      $ECHO "$headers" >> $file
    fi
    $ECHO "" >> $file
    $ECHO -n "$messagebody" >> $file
  done

  # Remove processed file:
  rm $1

  # Tell to smsd that checkhandler has spooled this message:
  exit 2
fi

exit 0
Gruß bimmi
Raspberry Pi B 512er Modell mit IPC natürlich. Was sonst... :) Und der rennt und rennt und rennt...
Benutzeravatar
jensebub
IPC Meister
Beiträge: 1133
Registriert: So 1. Mai 2011, 09:34
Been thanked: 1 time
Kontaktdaten:

Re: Aktion ausführen bei E-Mail - smstools

Beitrag von jensebub »

Hallo,
mir geht's da ähnlich, aber wahrscheinlich, weil ich im php-wahn durch IPC bin habe ich sofort auf php getippt :D

Natürlich führen viele Wege nach Rom,.... python is da nicht so meins,... aber für:
Woran es da allerdings happert ist wie bekomme ich den Nachrichtentext der ja Variabel ist in die Zeile 'Nachrichtenausschnitt aus der E-Mail'
Ich glaube für bash ist "sed" dort die richtige Wahl,...
Ich habe z.B. in i os oscam-patches.sh den Eintrag "patchNAME", der in die oscam-compile.sh eingetragen wird, egal, welcher wert da schon stand ;)

Code: Alles auswählen

sed -i -e "s/patchNAME=".*.*"/patchNAME=\"$key\"/g" /var/emu/script/oscam-compile.sh
http://openbook.galileocomputing.de/she ... 14_001.htm

Gruß
jensebub
bimmi
IPC Neuling
Beiträge: 31
Registriert: Fr 2. Nov 2012, 01:44
Kontaktdaten:

Re: Aktion ausführen bei E-Mail - smstools

Beitrag von bimmi »

Alsooooo ich bin jetzt weiter gekommen :) Danke Jensebub. Sed war der richtige Hinweis. Das ist von mir jetzt die quick and dirty Art mal schnell per Webformular SMS zu versenden :)

Die Vorgehensweise:

1. crontab führt mir alle X-Minuten sie sms.sh aus
2. die sms.sh ruft die email.py auf und holt damit die E-Mails ab und speichert den kompletten Inhalt der E-Mails in der /tmp/sms.txt.
3. Dann wird der Nachrichtentext aus der erstellten TXT Datei rausgefiltert
4. Und per sed wird der Nachrichtentext per sendsms versenden.
5. Das Postfach wird komplett durch die email_delete.py.

Und: Es funktionert. Ich weiß, das ganze ist absolut unsauber. Ein Mix aus Python und shell scripting, aber es funktioniert :) Mehr wollte ich (vorerst) nicht.

3 Dateien:

email.py

Code: Alles auswählen

import poplib

#config
user = 'benutzername'
pop_server = 'mail.popserver.de'
password = 'passwort'

#script 
Mailbox = poplib.POP3_SSL(pop_server, '995')
Mailbox.user(user)
Mailbox.pass_(password)
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
	for msg in Mailbox.retr(i + 1)[1]: 
		print msg
	
Mailbox.quit()
sms.sh

Code: Alles auswählen

#!/bin/bash

#Telefonnummern:

nummer1="0000000000000"
nummer2="0000000000000"
nummer3="0000000000000"
nummer4="0000000000000"

#Emails abholen per Pythonscript
python /root/sms_gateway/email.py >/tmp/email.txt

#Dateien durchsuchen
grep "Nachricht:" /tmp/email.txt | tail -1 >/tmp/sms.txt

#SMS senden:
sendsms $nummer1 |sed '/^Nachricht:$/a NEU' /tmp/sms.txt
sendsms $nummer2 |sed '/^Nachricht:$/a NEU' /tmp/sms.txt
sendsms $nummer3 |sed '/^Nachricht:$/a NEU' /tmp/sms.txt
sendsms $nummer4 |sed '/^Nachricht:$/a NEU' /tmp/sms.txt
sendsms $nummer5 |sed '/^Nachricht:$/a NEU' /tmp/sms.txt

#Dateien loeschen:
rm /tmp/email.txt
rm /tmp/sms.txt

#E-Mails löschen
python /root/sms_gateway/email_delete.py

exit 0
email_delete.py #Postfach leeren mit ner Grenze von 500 E-Mails.

Code: Alles auswählen

#!/usr/bin/python

import poplib

#config
user = 'benutzername'
pop_server = 'mail.popserver.de'
password = 'passwort'

whenToQuit = 500
loop = 0
totalMessages = 0

while 1:
        M = poplib.POP3(pop_server)
        M.user(user)
        M.pass_(password)
        numMessages = len(M.list()[1])
        if totalMessages == 0: totalMessages = numMessages
        i = 0
        for i in range(numMessages):
                print 'Deleted %d out of %d messages' % (loop * whenToQuit + i + 1, totalMessages)
                M.dele(i+1)
                if i == whenToQuit - 1:
                        M.quit()
                        loop = loop + 1
                        break

        if i != whenToQuit - 1:
                M.quit()
                break

Falls es noch nen Verbesserungsvorschlag gibt - NUR HER DAMIT!

z.B. Wäre es noch recht Praktisch wenn man die Telefonnummern einfacher Pflegen könnte. Evtl. auch mit einer .cfg oder einer .txt Datei.

Gruß bimmi
Raspberry Pi B 512er Modell mit IPC natürlich. Was sonst... :) Und der rennt und rennt und rennt...
Benutzeravatar
jensebub
IPC Meister
Beiträge: 1133
Registriert: So 1. Mai 2011, 09:34
Been thanked: 1 time
Kontaktdaten:

Re: Aktion ausführen bei E-Mail - smstools

Beitrag von jensebub »

bimmi hat geschrieben:...
z.B. Wäre es noch recht Praktisch wenn man die Telefonnummern einfacher Pflegen könnte. Evtl. auch mit einer .cfg oder einer .txt Datei.

Gruß bimmi
Dann nimm doch eine Datei "telefonbuch", in der bestimmst du nur die nummern:

Code: Alles auswählen

#!/bin/bash
#Peter
nummer1="0000000000000"
#Paul
nummer2="0000000000000"
#Mary
nummer3="0000000000000"
#Ich
nummer4="0000000000000"
Dann brauch deine sms.sh am Anfang:

Code: Alles auswählen

#!/bin/bash
#Telefonbuch auslesen
. /pfad/zum/telefonbuch
...
somit sind die Variablen $nummer1-4 aus dem "Telefonbuch" ;)

Gruß
jensebub

/EDIT: ich weiß die Frage kommt,... du kannst auch die Anzahl der Telefonbucheinträge per sms.sh "quasi" auslesen lassen, indem du im Telefonbuch mit indexen arbeitest:

Code: Alles auswählen

nummer["1"]="0000000000000"
und dann eine for schleife in der sms.sh, so ala:

Code: Alles auswählen

for index in ${!nummer[*]}; do
.......
//EDIT: ich hab da mal was gefunden, was dir vielleicht nützlich sein könnte wenigstens ein pyton-skript loszuwerden :P :D
Spoiler
Show

Code: Alles auswählen

#!/bin/bash
# fetchmail.sh:Andreas Rehm ITsolution², Thomas Bahn <tbahn@assono.de>
# Stand 0.3
#
# Diese Script muss mit einer bash/cygwin oder auf einem Unix Rechner
# gestartet werden.
# Es wird automatisch pro Tag ein Logfile angelegt.
# Es wird nur einmal fetchmail gestartet, wenn es bereits läuft wird
# abgebrochen.
# Archivierung alter Logfiles nach 7 Tagen mit bzip2 und automatische
# Löschung nach einem Jahr.
#
# Bitte beachten: Sie brauchen fetchmail und bzip2
#
# Geplant für die nächste Version:
#
###########################################################################
# History
# V0.1 - Initiale Version
# V0.2 - Fehlerbereinigung Löschen alter Logdateien
# V0.3 - Anpassungen von Thomas Bahn
#          Protokolle in /var/log
#          -v (verbose) bei fetchmail-Aufruf
#
###########################################################################

# Abbruch, wenn fetchmail noch läuft
ps -a | grep fetchmail && exit;

# Start
echo "Starte E-Mail-Abholung"

# Neue Logdatei ja / nein
NEWLOGFILE=0

# Log-Datei erstellen - LOGDATE ist das aktuelle Datum
LOGDATE=`date +'%Y-%m-%d'`
# Logdir ist der Ordner mit den Logdateien - dieser wird ggf. erstellt
LOGDIR='/var/log'
# Logfile ist die Logdatei, die sich aus den vorhergehenden Daten zusammensetzt
LOGFILE="${LOGDIR}/${LOGDATE}-fetchmail.log"

# Logdir erstellen wenn nötig
if [ ! -d ${LOGDIR} ]
then
       echo "Erstelle Logdir = ${LOGDIR}"
       mkdir -p ${LOGDIR}
fi

# Logfile anlegen, da sonst fetchmail kein Log schreibt
if [ ! -f ${LOGFILE} ]
then
       echo "Logdatei ${LOGFILE} erstellen..."
       touch ${LOGFILE}
       NEWLOGFILE=1
fi

# Anfang protokollieren
DATE=`date +'%d.%m.%Y %H:%M:%S'`
echo "Start der E-Mail-Abholung am ${DATE}" >> ${LOGFILE}

# E-Mail abholen
fetchmail -v -f /etc/fetchmailrc -L ${LOGFILE}

# Ende protokollieren
DATEEND=`date +'%d.%m.%Y %H:%M:%S'`
echo -e "Ende der E-Mail-Abholung am ${DATEEND}\n" >> ${LOGFILE}

# Logrotation wenn eine neue Datei angelegt wurde
if [ "${NEWLOGFILE}" == "1" ];
then
       # Dateien die älter als 7 Tage sind werden komprimiert
       find ${LOGDIR} -name \*.log -ctime 7 -exec bzip2 {} \;
       
       # Dateien die älter als 365 Tage sind werden gelöscht
       find ${LOGDIR} -name \*.log.bz2 -ctime 365 -exec rm {} \;
fi
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste