Seite 1 von 1

pop3, aber nur body

Verfasst: Montag 7. Januar 2019, 21:44
von Mardor
Hi,

ich habe ein Python3 Skript geschrieben. Dieses holt die Daten über pop3 ab. Leider erhalte ich die Mail mit Header und Body. Mein Ziel wäre es jedoch nur die Informationen im Mail-Body zu erhalten. Hätte jemand hierzu eine Idee oder einen Tipp.

Code: Alles auswählen

import poplib

mailserver = 'xxx.yyy.de'
emailID = 'aaaa@bbbbb.info'
emailpasswort = 'V49'

pop3_conn = poplib.POP3_SSL(mailserver)
pop3_conn.user(emailID)
pop3_conn.pass_(emailpasswort)

emailinfo = pop3_conn.stat()
print("Meine Nachricht")

anzahl = emailinfo[0]
for i in range(anzahl):
    for email in pop3_conn.retr(i + 1)[1]:
        print(email)                                                    

Code: Alles auswählen

b'\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))'
b'\t(Client did not present a certificate)'
...
b'Subject: Test'
...
b'Message-Id: <D725BB5C-04BB-4673-8819-334BB2613FFE@aaaa.ccc>'
b'To: ccccc@gggg.aaaa'
b''
b''
b''
b'Test'

Re: pop3, aber nur body

Verfasst: Montag 7. Januar 2019, 22:08
von __blackjack__
@Mardor: Die Standardbibliothek hat alles was man braucht um E-Mails zu parsen und die Einzelteile zu extrahieren. Alternativ könntest Du Dir die Spezifikation von E-Mails anschauen und selbst die Header abtrennen. Das ist recht einfach.

Re: pop3, aber nur body

Verfasst: Montag 7. Januar 2019, 22:08
von sls
Entweder händisch in dem du nur den Teil ab dem Boundary ausgibst, oder du verwendest einfach ein entsprechendes Modul zum parsen von Emails. Für Python3 gibt's z.B. email.utils.

Re: pop3, aber nur body

Verfasst: Montag 7. Januar 2019, 22:15
von Mardor
Hi,

wenn Ihr Standardbiblothek schreibt meint Ihr poplib ?

Gruß Mardor

Re: pop3, aber nur body

Verfasst: Montag 7. Januar 2019, 22:21
von sls
Nein, poplib ist ja afaik nur dazu da, um eine Mail von einem Server zu holen. Mit den zusätzlichen email-Modulen die bereits in der Standardbibliothek von Python (also bei der Installation) enthalten sind, kannst du die Nachricht parsen und verarbeiten.

z.B so (ungetestet mit deinem Code verheiratet):

Code: Alles auswählen

anzahl = emailinfo[0]
for i in range(anzahl):
    for email in pop3_conn.retr(i + 1)[1]:
        message = email.message_from_string(email.decode())
        print(message.get_payload())

Re: pop3, aber nur body

Verfasst: Dienstag 8. Januar 2019, 19:22
von Mardor
Hi,

danke für die Antworten.
Leider bekomme ich es immer noch nicht hin:

Wenn ich den Code benutze erhalte ich folgende Antwort:

Code: Alles auswählen

b'Return-Path: <aaa@bbbb.de>'
Traceback (most recent call last):
  File "pop3.py", line 22, in <module>
    message = email.message_from_string(email.decode())
AttributeError: 'bytes' object has no attribute 'message_from_string'
Ich habe auch schon folgendes getestet, jedoch erhalte ich hier keine Ausgabe:

Code: Alles auswählen

#	for j in body:
		print(j)
		try:
			msg = email.message_from_string(j.decode("utf-8"))
			strtext = msg.get_payload()
			print(strtext)
		except:
			pass
Auch nach mehreren Stunden testen finde ich hier absolut keine Lösung. Hättet Ihr noch einen Tipp.

Re: pop3, aber nur body

Verfasst: Dienstag 8. Januar 2019, 19:37
von __blackjack__
Jeder Name kann logischerweise nur an einen Wert zur gleichen Zeit gebunden werden. Wenn Du eine Funktion aus dem `email`-Modul verwenden willst, darfst Du die Bytes der Mail halt nicht *auch* an den Namen `email` binden, denn dann kommst Du über den Namen nicht mehr an das Modul heran.

Re: pop3, aber nur body

Verfasst: Dienstag 8. Januar 2019, 20:17
von sls
@Mardor:

in meinem Beispiel ist ein Fehler, da bei der Iteration der Name ´email´ das email-Modul shadowed. Du kannst stattdessen sowas wie ``for message in ...`` schreiben, um `email.message_from_string()` gefahrlos verwenden zu können und keine Kollision zu riskieren.