E-Mails von Web.de abrufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Robohac
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 22:59

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 :roll:

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.
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.
Robohac
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 22:59

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?"
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Robohac
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 22:59

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)
Zuletzt geändert von Robohac am Sonntag 27. März 2011, 13:12, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Robohac
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 22:59

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( )
    
    

        
BlackJack

@Robohac: Du hast Dir `response` aber auch schon mal angeschaut, wie das aussieht!?
Robohac
User
Beiträge: 5
Registriert: Freitag 25. März 2011, 22:59

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

Antworten