Seite 1 von 1
E-Mails von Web.de abrufen
Verfasst: Freitag 25. März 2011, 23:14
von Robohac
Hallo,
ich will ein Programm in Python schreiben, das E-Mails von meinem web.de konto abruft, und den Betreff oder den inhalt dann in eine Variable schreibt. Ich habe schon code gefunden, nur ist das Problem, dass er nicht funktioniert
Code: Alles auswählen
import poplib
from email import parser
pop_conn = poplib.POP3_SSL('pop3.web.de')
pop_conn.user('username')
pop_conn.pass_('password')
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
print message['subject']
pop_conn.quit()
da kommt dann beim Ausführen der Fehler:
Code: Alles auswählen
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "C:\Users\Sebastian\Desktop\test.py", line 6, in <module>
pop_conn.pass_('password')
File "E:\Python27\lib\poplib.py", line 189, in pass_
return self._shortcmd('PASS %s' % pswd)
File "E:\Python27\lib\poplib.py", line 152, in _shortcmd
return self._getresp()
File "E:\Python27\lib\poplib.py", line 128, in _getresp
raise error_proto(resp)
error_proto: -ERR [AUTH] Username and password not accepted.
>>>
ich habe natürlich mein Passwort eingegeben, da kommt aber der gleiche Fehler.
Ich würde mich über antworten freuen.
Re: E-Mails von Web.de abrufen
Verfasst: Freitag 25. März 2011, 23:25
von deets
Funktioniert bei mir einwandfrei. Den Fehler kann ich reproduzieren, indem ich falsche Angaben mache. Ich vermute also mal ganz stumpf, dass du dich vertippt hast oder glaubst zu wissen, was dein Passwort ist - aber dich irrst.
Re: E-Mails von Web.de abrufen
Verfasst: Freitag 25. März 2011, 23:58
von Robohac
stimmt ich hatte pop.gmail.com statt pop3.web.de da stehen
aber mal angenommen ich will Start ausgeben, wenn ich eine E-Mail mit dem Betreff "Stopp bekommen habe?"
Re: E-Mails von Web.de abrufen
Verfasst: Samstag 26. März 2011, 02:23
von Leonidas
Den Betreff gibts offenbar mit ``message['subject']`` und wie du prüfst ob ein String in einem anderen String vorkommt wird dir jedes anständige Python-Tutorial verraten.
Re: E-Mails von Web.de abrufen
Verfasst: Samstag 26. März 2011, 16:04
von Darii
Robohac hat geschrieben:ich habe natürlich mein Passwort eingegeben, da kommt aber der gleiche Fehler.
Du kannst bei web.de per pop nur alle 15min Mails abrufen. Evtl ist das das Problem.
Re: E-Mails von Web.de abrufen
Verfasst: Sonntag 27. März 2011, 11:04
von Robohac
Darii hat geschrieben:Du kannst bei web.de per pop nur alle 15min Mails abrufen. Evtl ist das das Problem.
Das stimmt! naja aber man muss das programm ja nur einmal starten.
Ich hab jetzt ein Programm geschrieben, was nach dem Inhalt des Betreffs der ungelesenen nachichten schaut.
Ich hab mit garantie eine E-Mail im Postfach mit dem Betreff "stop" und "start" aber das Programm reagiert nicht darauf. Ich vermute, dass es an dem "== stop" liegt, da das ja nur stop erwartet. Giebt es einen Befehl mit dem man Prüfen kann ob "stop" unteranderem enthalten ist?
Hier mein Code (Natürlich ohne Passwort und Username):
Code: Alles auswählen
import poplib
from email import parser
pop_conn = poplib.POP3_SSL('pop3.web.de')
pop_conn.user('usr')
pop_conn.pass_('pass')
while 1:
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
if message['subject'] == stop:
print "Stop ist im Betreff enthalten"
elif message['subject'] == start:
print "Start ist im Betreff enthalten"
else:
print "Nichts"
#pop_conn.quit()
Achja: Es giebt keine Fehlermeldungen (außer diese verfammte 15min Klausel)
Re: E-Mails von Web.de abrufen
Verfasst: Sonntag 27. März 2011, 11:41
von Leonidas
Robohac hat geschrieben:Ich vermute, dass es an dem "== stop" liegt, da das ja nur stop erwartet. Giebt es einen Befehl mit dem man Prüfen kann ob "stop" unteranderem enthalten ist?
Ja gibt es und wie gesagt, ein Tutorial verrät dir diesen.
Hier nochmal der Wink mit dem Zaunpfahl explizit: schau dir doch mal das Tutorial an. Sachen wie ``range(1, len(pop_conn.list()[1]) + 1)`` sind nämlich fast immer überflüssig und zudem auch noch völlig unlesbar!
Re: E-Mails von Web.de abrufen
Verfasst: Sonntag 27. März 2011, 11:44
von /me
Robohac hat geschrieben:Achja: Es giebt keine Fehlermeldungen (außer diese verfammte 15min Klausel)
Das kann eigentlich nicht sein. Du verwendest die Bezeichner
stop und
start denen du nirgendwo einen Wert zugewiesen hast. Ich würde da einen NameError erwarten.
Re: E-Mails von Web.de abrufen
Verfasst: Sonntag 27. März 2011, 17:22
von Robohac
Hy,
ich hab den Code nochmal komplett neu geschrieben, alles funktioniert (Ja ich weiß dass es die While schleife bei Web nicht bringt, aber damit das Programm universell bleibt). Die Macke, dass mindestens eine E-Mail im Postfach sein muss, damit das Programm startet ist vertretbar.
Ich finde nur leider den Fehler nicht, da Auch wenn eine E-Mail mit dem Inhalt "start" im Postfach ist das Programm nicht "Loooooooooos!" ausgiebt.
Code: Alles auswählen
import sys, getpass, poplib, re
import serial
import time
# Arduino
COMPORT = 0
BAUDRATE = 115200
# change according to your needs
POPHOST = "pop.web.de"
POPUSER = "Username"
POPPASS = "Password"
# the number of message body lines to retrieve
MAXLINES = 10
HEADERS = "@testprogramm".split()
print "Erwartete Header: %s" % (HEADERS)
print "Max. Zeilen: %s" % (MAXLINES)
# headers you're actually interested in
rx_headers = re.compile('|'.join(HEADERS), re.IGNORECASE)
# connect to POP3 and identify user
pop = poplib.POP3(POPHOST)
pop.user(POPUSER)
if not POPPASS or POPPASS=='=':
# if no password was supplied, ask for it
POPPASS = getpass.getpass("Password for %s@%s:" % (POPUSER, POPHOST))
# authenticate user
pop.pass_(POPPASS)
# get general information (msg_count, box_size)
stat = pop.stat( )
# print some information
print "Logged in as %s@%s" % (POPUSER, POPHOST)
print "Status: %d message(s), %d bytes" % stat
print "Waiting for assignment for Arduino"
# eigentliche Programm
TIME = 10
bye = 0
count_del = 0
while 1:
for n in range(stat[0]):
msgnum = n+1
# retrieve headers
response, lines, bytes = pop.top(msgnum, MAXLINES)
print "Status: %d message(s), %d bytes" % stat
if "start" in response:
print "Loooooooooos!"
pop.quit( )
# Waits TIMEs
time.sleep(TIME)
# headers you're actually interested in
rx_headers = re.compile('|'.join(HEADERS), re.IGNORECASE)
# connect to POP3 and identify user
pop = poplib.POP3(POPHOST)
pop.user(POPUSER)
if not POPPASS or POPPASS=='=':
# if no password was supplied, ask for it
POPPASS = getpass.getpass("Password for %s@%s:" % (POPUSER, POPHOST))
# authenticate user
pop.pass_(POPPASS)
# get general information (msg_count, box_size)
stat = pop.stat( )
Re: E-Mails von Web.de abrufen
Verfasst: Sonntag 27. März 2011, 19:22
von BlackJack
@Robohac: Du hast Dir `response` aber auch schon mal angeschaut, wie das aussieht!?
Re: E-Mails von Web.de abrufen
Verfasst: Dienstag 29. März 2011, 19:13
von Robohac
So ich hab es jetzt geschafft ein Programm zu schreiben was auf "Stopp" reagiert.
Hier der Code:
Code: Alles auswählen
# -*- coding: cp1252 -*-
import sys, getpass, poplib, re
import serial
import time
# arduino connection
COMPORT = 0
BAUDRATE = 115200
# change according to your needs
POPHOST = "pop.web.de"
POPUSER = "Username@web.de"
POPPASS = raw_input("Bitte gieb dein E-Mail Passwort ein:")
# the number of message body lines to retrieve
MAXLINES = 10
HEADERS = "@Pythonorogramm".split()
print "Erwartete Header: %s" % (HEADERS)
print "Max. Zeilen: %s" % (MAXLINES)
# headers you're actually interested in
rx_headers = re.compile('|'.join(HEADERS), re.IGNORECASE)
try:
# Hauptmenüü
while 1:
# Space
print
print
print 50 * "_"
print
print
print
key = raw_input("(w=wait for Massage, o=organize Mailbox, q=quit) What?")
if key == 'w':
# Anfang warten
# connect to POP3 and identify user
pop = poplib.POP3(POPHOST)
pop.user(POPUSER)
if not POPPASS or POPPASS=='=':
# if no password was supplied, ask for it
POPPASS = getpass.getpass("Password for %s@%s:" % (POPUSER, POPHOST))
# authenticate user
pop.pass_(POPPASS)
# get general information (msg_count, box_size)
stat = pop.stat( )
# print some information
print "Logged in as %s@%s" % (POPUSER, POPHOST)
print "Status: %d message(s), %d bytes" % stat
print "Waiting for assignment for Arduino"
# eigentliche Programm
TIME = 10
bye = 0
count_del = 0
while 1:
n = 0
for n in range(stat[0]):
msgnum = n + 1
# retrieve headers
response, lines, bytes = pop.top(msgnum, MAXLINES)
# suchen nach Begriff
#if lines.find('Stop') != -1:
#print "Stop in if gefunden!"
if 'Stop' in lines:
print "Stop Gefunden!!!"
n = n + 1
n = 0
print "Status: %d message(s), %d bytes" % stat
if "start" in response:
print "Loooooooooos!"
pop.quit( )
# Waits TIMEs
time.sleep(TIME)
# headers you're actually interested in
rx_headers = re.compile('|'.join(HEADERS), re.IGNORECASE)
# connect to POP3 and identify user
pop = poplib.POP3(POPHOST)
pop.user(POPUSER)
if not POPPASS or POPPASS=='=':
# if no password was supplied, ask for it
POPPASS = getpass.getpass("Password for %s@%s:" % (POPUSER, POPHOST))
# authenticate user
pop.pass_(POPPASS)
# get general information (msg_count, box_size)
stat = pop.stat( )
# Ende warten
elif key == 'o':
# Anfang Organisation
# connect to POP3 and identify user
pop = poplib.POP3(POPHOST)
pop.user(POPUSER)
if not POPPASS or POPPASS=='=':
# if no password was supplied, ask for it
POPPASS = getpass.getpass("Password for %s@%s:" % (POPUSER, POPHOST))
# authenticate user
pop.pass_(POPPASS)
# get general information (msg_count, box_size)
stat = pop.stat( )
# print some information
print "Logged in as %s@%s" % (POPUSER, POPHOST)
print "Status: %d message(s), %d bytes" % stat
bye = 0
count_del = 0
for n in range(stat[0]):
msgnum = n+1
# retrieve headers
response, lines, bytes = pop.top(msgnum, MAXLINES)
# print message info and headers you're interested in
print "Message %d (%d bytes)" % (msgnum, bytes)
print "-" * 30
print "\n".join(filter(rx_headers.match, lines))
print "-" * 30
# input loop
while 1:
k = raw_input("(d=delete, s=skip, v=view, q=quit) What?")
#k = k[:1].lower( )
if k == 'd':
# Mark message for deletion
k = raw_input("Delete message %d? (y/n)" % msgnum)
if k in "yY":
pop.dele(msgnum)
print "Message %d marked for deletion" % msgnum
count_del += 1
break
elif k == 's':
print "Message %d left on server" % msgnum
break
elif k == 'v':
print "-" * 30
print "\n".join(lines)
print "-" * 30
elif k == 'q':
bye = 1
break
# done ...
if bye:
print "Bye"
break
# summary
print "Deleting %d message(s) in mailbox %s@%s" % (
count_del, POPUSER, POPHOST)
# close operations and disconnect from server
print "Closing POP3 session"
pop.quit( )
# Ende Organisation
elif key == 'q':
quit()
else:
print "Falsche Eingabe. Bitte versuche es nocheinmal."
except poplib.error_proto, detail:
# possible error
print "POP3 Protocol Error:", detail