PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Python Email versand



DanielSan
20.11.2012, 11:12
Hi,

ich weiss das hat nicht direkt mit dem Raspberry zu tun, aber ich hoffe ihr könnt mir trotzdem helfen.

Ich habe mir ein kleines Pythonscript geschrieben, welches mir bei Ausführung meine externe IP per E-Mail senden soll. Klar könnte ich auch einen DynDNS dienst nehmen, das möchte ich aber nicht.

Eigentlich funktioniert das Script, nur leider ist die E-Mail die bei mir ankommt immer leer. Weiss einer woran das liegt? Die IP wird korrekt ausgelesen, was ich durch den print befehl überprüft habe.

Hier mein Code:

import smtplib
import urllib2

def get_ip():
ip = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp").read()
print "IP: ", ip
return ip

def send_ip():
msg = get_ip()
sender = "******@gmx.de" # Email des Absenders eintragen
empfaenger = "******@gmx.de" # Email des Empfaenfers eintragen
s = smtplib.SMTP("smtp.gmx.de") # SMTP-Server deines Email-Anbieters eintragen
s.login("******@gmx.de", "******") # LogIn-Name und Passwort deines Email_Accounts eintragen
s.sendmail(sender, empfaenger, msg)
s.quit()

if __name__ == "__main__":
send_ip()



Danke
Gruß Daniel

danimath
20.11.2012, 11:33
Moin Daniel,

ich bin jetzt nicht so der python-Guru/Freund, aber schau mal hier (http://www.hamsoftengineering.com/codeSharing/pythonEmail/pythonEmail.html) oder hier (http://www.blog.pythonlibrary.org/2010/05/14/how-to-send-email-with-python/); kann sein, dass Du das From/To/Date/Subject-Geraffel noch in msg mit aufnehmen musst.


msg = 'From: %s\nTo: %s\nDate: %s\nSubject: %s\n%s' \
% (sender, receiver, datestr, subj, bodyText)

viele Grüße
Andreas

DanielSan
20.11.2012, 12:27
Hi,

danke für den Link, der hat mir etwas weitergeholfen.

Ich kriege es jetzt hin das alle Informationen in der Absenderinformation in Thunderbird dargestellt werden. Das reicht zwar prinzipiell für meine Anwendung, ist aber nicht besonders schön.


import smtplib
import urllib2

def get_ip():
ip = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp").read()
#print "IP: ", ip
return ip

def send_ip():
print "IP: ", get_ip()
sender = "******@gmx.de" # Email des Absenders eintragen
receiver = "******@gmx.de" # Email des Empfaenfers eintragen
datestr = "datum" #ist nicht wichtig dient nur dem füllen des Strings
subj = "new IP"
bodyText = get_ip()
s = smtplib.SMTP("mail.gmx.net") # SMTP-Server deines Email-Anbieters eintragen
s.login("******@gmx.de", "******") # LogIn-Name und Passwort deines Email_Accounts eintragen
msg = 'From: %s To: %s Date: %s Subject: %s %s' % (sender, receiver, datestr, subj, get_ip())
s.sendmail(sender, receiver, msg)
s.quit()

if __name__ == "__main__":
send_ip()


Wenn ich in der Zeile "msg = ..." nach dem %s ein \n einfüge kommt komischerweise wieder eine leere Mail an. Hat noch jemand einen Tip?

Danke
Gruß Daniel

danimath
20.11.2012, 13:02
Ich habe mal unseren Mail-Server missbraucht, ich hoffe die Admins stehen nicht gleich mit der Axt in der Tür;)


msg = 'From: %s\nTo: %s\nDate: %s\nSubject: %s\n%s' % (sender, receiver, datestr, subj, get_ip())

(Also: 4 mal "\n" !!)

Kommt problemlos an; mit Absender, An, Betreff und Textbody. Lasse ich auch nur ein "\n" weg, gibt's leere Bodies oder auch "undisclosed recepients" als An oder Absender - auf jeden Fall merkwürdige Effekte.

viele Grüße
Andreas

Kampi
20.11.2012, 13:29
Schau mal hier:

http://kampis-elektroecke.de/?page_id=2324

Ich habe den E-Mail Versand über das Raspberry Pi mit einem Pythonskript, welches ich als Grundlage nehme, realisiert. Das Skript wird dann einfach aufgerufen und ein paar Parameter übergeben (kannst ja deine IP als Parameter definieren).
Eventuell kannst du das Skript ja verwenden und "ausschlachten".
Das Skript kannst du am Ende der Seite downloaden.

ePyx
20.11.2012, 13:55
Schau mal hier:

http://kampis-elektroecke.de/?page_id=2324

Ich habe den E-Mail Versand über das Raspberry Pi mit einem Pythonskript, welches ich als Grundlage nehme, realisiert. Das Skript wird dann einfach aufgerufen und ein paar Parameter übergeben (kannst ja deine IP als Parameter definieren).
Eventuell kannst du das Skript ja verwenden und "ausschlachten".
Das Skript kannst du am Ende der Seite downloaden.

Nur eine grundsätzliche Frage : Warum benutzt ihr nicht einfach mail (http://unixhelp.ed.ac.uk/CGI/man-cgi?mail) ?

Kampi
20.11.2012, 14:01
Weil Mail nicht funktioniert.
Hab es bereits darüber probiert aber ich glaube das ist nicht integriert.....zumindest kam immer sowas:

bash: cannot found mail

Auf die Idee bin ich ja auch bereits gekommen ^.^

ePyx
20.11.2012, 15:04
hmm, hab nichts direkt gefunden, aber hier (http://www.raspberrypi.org/phpBB3/viewtopic.php?f=36&t=20216)geht es anscheinend.

DanielSan
20.11.2012, 15:24
@danimath (https://www.roboternetz.de/community/members/51106-danimath) Das klappt bei mir nicht. Das komische ist wenn ich eine andere E-Mailadresse bei receiver angebe, kriege ich garkeine Mail.

@Kampi: Das guck ich mir mal an danke.

@ePyx: Mail kannte ich bisher noch nicht, deswegen hab ichs garnicht erst damit versucht ;-)

- - - Aktualisiert - - -

So Problem gelöst!

Ich habe das Script von Kampi mit meinem vorhandenen "verheiratet". Hier das Ergebniss:



import smtplib
import urllib2
import datetime
from email.mime.text import MIMEText

def get_ip():
ip = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp").read()
return ip

def send_ip():

sender = "******@gmx.de" # Email des Absenders eintragen
receiver = "******@gmx.de" # Email des Empfaenfers eintragen
s = smtplib.SMTP("mail.gmx.net") # SMTP-Server deines Email-Anbieters eintragen
s.login("******@gmx.de", "******") # LogIn-Name und Passwort deines Email_Accounts eintragen

# Aktuelles Datum holen
Datum = datetime.date.today()
# Text
my_ip = get_ip()
print "IP: " + my_ip
msg = MIMEText(my_ip)
msg['Subject'] = 'Nachricht vom Raspberry Pi - %s' % Datum.strftime('%b %d %Y')
msg['From'] = sender
msg['To'] = receiver

s.sendmail(sender, receiver, msg.as_string())

if __name__ == "__main__":
send_ip()


Damit klappt es auch mit anderen E-Mailadressen als Empfänger.
Jetzt muss ich nurnoch die IP in eine Datei schreiben und das Script soweit erweitern, das er mir nur bei einer IP Änderung eine E-Mail schickt. Da ich Unitymedia habe, kriege ich dann nur ca. alle 3 Monate eine E-Mail.

Danke für eure Hilfe!
Gruß Daniel

DanielSan
21.11.2012, 11:26
So jetzt hab ich das schreiben der IP in eine Datei auch implementiert. Dadurch bekomme ich nurnoch bei Änderung der IP eine E-Mail.

Hier der komplette Code:


import smtplib
import urllib2
import datetime
from email.mime.text import MIMEText

def get_ip():
ip = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp").read()
#print "IP: ", ip
return ip

def send_ip():
sender = "******@gmx.de" # Email des Absenders eintragen
receiver = "******@gmx.de" # Email des Empfaenfers eintragen
s = smtplib.SMTP("mail.gmx.net") # SMTP-Server deines Email-Anbieters eintragen
s.login("******@gmx.de", "******") # LogIn-Name und Passwort deines Email_Accounts ei$

# Aktuelles Datum holen
Datum = datetime.date.today()
# Text
my_ip = get_ip()
print "IP: " + my_ip #DEBUG
msg = MIMEText(my_ip)
# Betreff + Datum
msg['Subject'] = 'Nachricht vom Raspberry Pi - %s' % Datum.strftime('%b %d %Y')
# Absender
msg['From'] = sender
#Empfaenger
msg['To'] = receiver

s.sendmail(sender, receiver, msg.as_string())
s.quit()

if __name__ == "__main__":
file = open("/home/******/cronscripts/myip.txt").read()
myip = get_ip()
if file[0:15] != myip:
file = open("/home/******/cronscripts/myip.txt","w")
file.write(myip)
file.close()
send_ip()


Ausgeführt wird er mit einem Cronjob alle 5 Minuten. Dazu muss man mit dem Shellbefehl "crontab -e" die Crontab öffnen und folgendes unten einfügen:


#------------------------------------------------------
5 * * * * python /home/*****/cronscripts/sendip.py
#-------------------------------------------------------


Evtl. hilft das ja noch dem ein oder anderen.

Ich habe auch in einem Nebensatz gelesen, das wenn ein Programm welches mit einem Cronjob ausgeführt wird eine Ausgabe auf der Konsole erzeugt, diese per Mail an den jeweiligen benutzer gesendet wird. Das wäre natürlich klasse. Allerdings weiss ich nicht wo ich meine E-Mail daten angeben muss. Da muss ich mich dann erst einlesen.

Danke für eure Unterstützung.

Kampi
21.11.2012, 12:10
Hey,

schön das es nun funktioniert :)
Das Skript habe ich selber mal irgendwo im Internet gefunden. Die Ursprungsversion hat auch einfach nur die IP-Adresse gesendet.
Da ich das eventuell noch in meinen Bus mit integrieren möchte (so viele Baustellen und so wenig Zeit :( ) habe ich mir mal den Spaß gegönnt und das Skript ein bisschen allgemeiner gestaltet....bzw. gebastelt ^.^

Echtor
22.11.2012, 00:06
Würde nicht auch ein einfaches


curl http://automation.whatismyip.com/n09230945.asp | mail -s "Das ist deine IP" "fu@bar.com"

gehen?

Edit:
kann sein das curl in eine Variable muss, ist nicht getestet^^

DanielSan
22.11.2012, 22:09
Das schickt mir ja ständig eine E-Mail mit meiner IP. Ich möchte ja nur eine E-Mail bekommen, wenn sie sich geändert hat. Sonst würde ich bei meinen aktuellen Einstellungen alle 5 Minuten eine E-Mail per Push auf mein Handy bekommen und das 24/7. Ich glaub das ließe mich zwar wichtig aussehen, aber nerven würde es auch! :-)

ePyx
23.11.2012, 05:29
Wie wäre es dann mit einem Cron-Job ?

DanielSan
23.11.2012, 08:12
Ja hab ich ja gemacht -> Post #10.
Wenn man dann Echtors Methode verwendet kriegt man aber jedesmal die IP zugeschickt. Ich will aber das ich nur wenn eine neue IP vorhanden ist diese zugeschickt bekomme. Das funktioniert ja auch schon längst bei mir. -> Post #10.
Es geht ja jetzt nurnoch drum das der Vorschlag von Echtor leider nicht das geünschte ergebniss bringt.

ePyx
23.11.2012, 09:51
Der Knackpunkt ist, dass viele Weg nach Rom führen. Unter Linux sind es dann noch mal mindestens nochmal so viele Wege. Ob du nun dein Pythonskript via Cron aufrufst oder die Befehle in ein BASH-Skript packst oder direkt von Cron aufrufen, ist völlig Schnuppe.

Meine Bemerkung bezog sich auch mehr auf die Aussage, dass es nicht das gewünschte Ergebnis erzielt. Was halt nicht wirklich stimmt.

DanielSan
23.11.2012, 10:05
Ok. Hab ich es dann falsch verstanden und der Befehl von Echtor schickt mir nur eine E-Mail wenn die IP sich geändert hat? ;-)
Ich denke damit wird nicht das erreicht was mein Pythonscript jetzt macht.

Klar gibt es viele wege nach Rom. Ich habe mich in diesem Fall auch nicht so richtig bewusst für den Pythonscriptweg entschieden. Das hab ich so gemacht weil das die einfachste mir bekannte Lösung ist/war.

Echtor
23.11.2012, 14:27
Wollte nur zeigen das Bash da evtl einfacher ist, für deinen zweck wäre das dann sowas:


#!/bin/bash
curl -s echtor.net/ip > /tmp/ip
ip1=$(cat /tmp/ip)
ip2=$(curl -s echtor.net/ip)
if [ "$ip1" != "$ip2" ]
then
echo $ip2 > /tmp/ip
echo $ip2| mail -s "Das ist deine IP" "fu@bar.com"
fi


untested, mail ist bei mir nicht eingerichtet >_<
Gruß