Gmails Mails abrufen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
easyride
User
Beiträge: 3
Registriert: Mittwoch 18. September 2013, 19:13

Guten Abend
ich hoffe mal das es hier richtig aufgehoben ist.
Ich versuche gerade ein kleines Programm zu schreiben welches mir die Mails von meinem Googlemail Acc runterlädt und in einer Datei abspeichert.
Theoretisch kein Problem, aber Praktisch. Habe mich eingelesen und gelernt das, dass ganze mit POP3 funktioniert. Nur da scheitert es schon:

Code: Alles auswählen

import poplib

server = poplib.POP3('pop.gmail.com', 995)
nur damit bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python33\lib\poplib.py", line 87, in __init__
self.welcome = self._getresp()
File "C:\Python33\lib\poplib.py", line 128, in _getresp
resp, o = self._getline()
File "C:\Python33\lib\poplib.py", line 112, in _getline
if not line: raise error_proto('-ERR EOF')
poplib.error_proto: -ERR EOF
Muss dazu sagen das, das ganze noch im Python Terminal läuft und nicht als eigenes Programm.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@easyride:
Die Portnummer 995 deutet an, dass der Zugang über SSL läuft, d.h. Du brauchst poplib.POP3_SSL.

Generell würde ich Dir zur Nutzung von IMAP raten, damit bist Du flexibler.
easyride
User
Beiträge: 3
Registriert: Mittwoch 18. September 2013, 19:13

Okey danke für den Tipp. Es ist echt einfacher zu Händeln. Jetzt habe ich nur folgendes Problem:
Ich hole mir die Mail und sie liegt dann im HTML Code vor. Diesen konvertiere ich dann mit:

Code: Alles auswählen

email_message = email.message_from_string(str(raw_email))
in lesbaren Text. Laut Google sollte man dann mit:

Code: Alles auswählen

print (email_message["Subject"])
die Nachricht lesen können. Nur bei mir gibt es None zurück. Die komplette Nachricht (Emailadresse natürlich geändert)(Hole ich mit: "print (email_message.items())"):
[("b'MIME-Version", '1.0\\r\\nReceived: by 10.221.7.201 with HTTP; Sat, 21 Sep 2013 08:41:26 -0700 (PDT)\\r\\nReceived: by 10.221.7.201 with HTTP; Sat, 21 Sep 2013 08:41:26 -0700 (PDT)\\r\\nDate: Sat, 21 Sep 2013 17:41:26 +0200\\r\\nDelivered-To: blablabla@gmail.com\\r\\nMessage-ID: <CABPD67Tmm7oaZjcMF1BYG-xajH8Hr8E8Fn=pnuudf2cixy0uwg@mail.gmail.com>\\r\\nSubject: Test\\r\\nFrom: tom engemann <tomengemann@gmail.com>\\r\\nTo: tom <blablabla@gmail.com>\\r\\nContent-Type: multipart/alternative; boundary=f46d0434c0acb7698104e6e69e8c\\r\\n\\r\\n--f46d0434c0acb7698104e6e69e8c\\r\\nContent-Type: text/plain; charset=ISO-8859-1\\r\\n\\r\\nTest\\r\\n\\r\\n--f46d0434c0acb7698104e6e69e8c\\r\\nContent-Type: text/html; charset=ISO-8859-1\\r\\n\\r\\n<p dir="ltr">Test</p>\\r\\n\\r\\n--f46d0434c0acb7698104e6e69e8c--\'')]
BlackJack

@easyride: Du wandelst da eine Datenstruktur in eine Zeichenkette um und versuchst das dann als E-Mail zu parsen. Das geht natürlich nicht. `email.message_from_string()` musst Du schon eine gültige E-Mail nach RFC822-Spezifikation beziehungsweise deren Nachfolgern an diese Funktion übergeben. Wobei die Datenstruktur auch schon recht ebenteuerlich aussieht. Das ist eine Liste die ein einziges Tupel enthält mit zwei Elementen wobei die Trennung der Werte von diesen zwei Elementen irgendwie kaputt aussieht. Das heisst Deine Ausgangsdaten sind schon falsch, da kann man nichts mit anfangen, jedenfalls nicht sicher und zuverlässig.
easyride
User
Beiträge: 3
Registriert: Mittwoch 18. September 2013, 19:13

Mein Code:

Code: Alles auswählen

import imaplib, email
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('mailadresse@gmail.com', 'passwort')
mail.list()
mail.select("inbox") # connect to inbox.
result, data = mail.search(None, "ALL")

ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated string
latest_email_id = id_list[-1] # get the latest

result, data = mail.fetch(latest_email_id, "(RFC822)") # fetch the email body (RFC822) for the given ID

raw_email = data[0][1] # here's the body, which is raw text of the whole email
# including headers and alternate payloads

email_message = email.message_from_string(raw_email)

print email_message['Subject']
BlackJack

@easyride: Das läuft bei mir problemlos durch, mit dem erwarteten Ergebnis. Die Zwischenergebnisse sehen aber auch schon anders aus als das was Du hier gepostet hast. Da war ja zum Beispiel ein Python 3.x `bytes`-Literal drin, was nicht zu einer Python 2.x ``print``-Anweisung passt. Das kann also ganz offensichtlich nicht der Quelltext sein der zu der vorher geposteten Ausgabe gehört!
Antworten