pop3, aber nur body

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

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'
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

Hi,

wenn Ihr Standardbiblothek schreibt meint Ihr poplib ?

Gruß Mardor
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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())
When we say computer, we mean the electronic computer.
Mardor
User
Beiträge: 27
Registriert: Montag 9. Februar 2015, 19:07

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@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.
When we say computer, we mean the electronic computer.
Antworten