eMail Header mit mehreren Received Einträgen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Sarkany
User
Beiträge: 8
Registriert: Dienstag 2. April 2019, 08:09
Wohnort: schönste Stadt am Rhein

Guten Morgen an alle,

ich arbeite seit ca. 4 Mon. mit python in der Vers. 3.7 und bin folglich weit weg von Professionalität. Veranlassung mich in python einzuarbeiten war, das wir i.d.Firma an die 100 eMails pro Tag erhalten, die ich mittels eines Python Scripts empfange und die Anhänge zur Weiterverarbeitung in die entsprechenden Ordner speichere und auch die eMails in entsprechende Postfach-Ordner verschiebe.

So weit läuft auch alles, nur habe ich folgendes Problem: Obwohl die eMail-Konten, die ich bearbeite nirgends veröffentlicht werden und bis heute noch nie "Fremdmails oder Spam" in den Postfächern war prüfe ich dennoch die Absender-IP. Jetzt kommt es aber vor, das in einer eMail mehrere "Received"-Einträge vorhanden sind. Auch habe ich gelesen das es kein Problem ist in eine Spam-Mail einen falschen Received-Eintrag einzufügen, weshalb ich alle Received-Einträge auf fremde IP-Adressen überprüfen möchte.

Das Problem ist jedoch das bei gleichen Keys immer nur der Inhalt des ersten Keys ausgegeben wird. Folgendes habe ich ausprobiert:

Code: Alles auswählen

...
nachricht = email.message_from_string(raw_data)
>>> print(nachricht.keys())
['Return-Path', 'Received', 'Received', 'Received', 'Date', 'From', 'To', 'Message-ID', 'Subject', 'MIME-Version', 'Content-Type', 'Envelope-To', 'X-Spam-Flag', 'X-UI-Filterresults']

>>> for wert in nachricht:
	print(wert)

Return-Path
Received
Received
Received
Date
From
To
Message-ID
Subject
MIME-Version
Content-Type
Envelope-To
X-Spam-Flag
X-UI-Filterresults
also dachte ich wenn ich über Nachricht iteriere müsste eigentlich auch der jeweilige Inhalt ausgegeben werden, was leider nicht funktioniert, ich erhalte immer nur den Inhalt des ersten Received-Eintrags.

Code: Alles auswählen

...
>>> for wert in nachricht:
	if wert == "Received":
		print(nachricht[wert])

from rsp-mx0.xxx.eu ([xx.xx.xxx.xx]) by mx.kundenserver.de
(mxeue010 [xxx.xxx.15.41]) with ESMTPS (Nemesis) id 1MibLj-1ggqAx0o7T-00fXcT
for <postfach@firma.de>; Tue, 02 Apr 2019 08:46:08 +0200

from rsp-mx0.xxx.eu ([xx.xx.xxx.xx]) by mx.kundenserver.de
(mxeue010 [xxx.xxx.15.41]) with ESMTPS (Nemesis) id 1MibLj-1ggqAx0o7T-00fXcT
for <postfach@firma.de>; Tue, 02 Apr 2019 08:46:08 +0200

from rsp-mx0.xxx.eu ([xx.xx.xxx.xx]) by mx.kundenserver.de
(mxeue010 [xxx.xxx.15.41]) with ESMTPS (Nemesis) id 1MibLj-1ggqAx0o7T-00fXcT
for <postfach@firma.de>; Tue, 02 Apr 2019 08:46:08 +0200
wie lese ich bei mehreren Keys mit dem Namen "Received" die nachfolgenden gezielt aus?

Vielen Dank im Voraus
das Schönste am Programmieren ist, dass man mit Ausdauer und Hartnäckigkeit am Ende immer belohnt wird. :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sarkany: Damit der letzte Versuch funktionieren würde, müsste das `nachricht`-Objekt ja irgendwie wissen das es in einer ``for``-Schleife aufgerufen wird, und das `wert` die Laufvariable ist, und das wievielte mal die an den gleichen Wert gebunden ist. Das wäre alles ein bisschen sehr viel Magie.

Du hast ja anscheinend herausgefunden, dass es eine `keys()`-Methode gibt. Schau doch in der Dokumentation mal nach was `nachricht` noch so alles an Methoden gibt, denn da gibt es eine die alle Werte zu einem gegebenen Header-Namen liefert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sarkany
User
Beiträge: 8
Registriert: Dienstag 2. April 2019, 08:09
Wohnort: schönste Stadt am Rhein

Hallo blackjack,

sicherlich meist du get_all().

Code: Alles auswählen

vons = nachricht.get_all("Received")
"vons" ist dann eine Liste über die ich iterieren kann.
.. das habe ich nämlich auch gerade herausgefunden.
Dennoch vielen Dank für den Tipp.

Solltest Du eine effektivere Lösung gemeint haben wäre ich für einen weiteren Hinweis dankbar.
das Schönste am Programmieren ist, dass man mit Ausdauer und Hartnäckigkeit am Ende immer belohnt wird. :mrgreen:
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Sarkany hat geschrieben: Dienstag 2. April 2019, 09:52
Obwohl die eMail-Konten, die ich bearbeite nirgends veröffentlicht werden und bis heute noch nie "Fremdmails oder Spam" in den Postfächern war prüfe ich dennoch die Absender-IP. Jetzt kommt es aber vor, das in einer eMail mehrere "Received"-Einträge vorhanden sind. Auch habe ich gelesen das es kein Problem ist in eine Spam-Mail einen falschen Received-Eintrag einzufügen, weshalb ich alle Received-Einträge auf fremde IP-Adressen überprüfen möchte.
Die Received-Lines sind rein informativ und werden von jedem Gateway eigenverantwortlich hinzugefügt. Jedes Gateway kann da allerdings eintragen, was es will. E-Mail ist so eine Sache. Du kannst bei den Headern so ziemlich alles faken. Wenn du einen Brief mit der Post verschickst, kannst du einen falschen Absender draufschreiben. Im Grunde genommen kannst du nur auf SMTP-Ebene sicher sein, dass der envelope-to der richtige ist, anders würdest du ja die E-Mail als Empfänger auch nicht erhalten. Der "To" auf Mime-Ebene kann hingegen auch verändert werden. Ich könnte dir eine E-Mail schreiben, mit Absender "steve.jobs@apple.com" und sogar die "To"-Adresse verändern, dein E-Mail-Client würde dir also eine andere Empfängeradresse anzeigen (was geht, aber nicht sinnvoll ist).

Mir stellt sich die Frage, was der Sinn deiner Übung sein soll. Wenn die E-Mail-Adressen rein lokal fungieren, musst du doch nichts validieren. Wenn ein Gateway in eurer Infrastruktur existieren *könnte* das E-Mails manipuliert habt ihr sowieso verloren.

Sind die E-Mail-Konten doch im großen WWW verfügbar, sind andere Technologien gefragt: SPF, DKIM etc.

Wichtig ist also erstmal die entsprechenden RFCs lesen und verstehen wie E-Mail funktioniert:

https://tools.ietf.org/html/rfc2821
(https://tools.ietf.org/html/rfc821)
When we say computer, we mean the electronic computer.
Sarkany
User
Beiträge: 8
Registriert: Dienstag 2. April 2019, 08:09
Wohnort: schönste Stadt am Rhein

sls hat geschrieben: Dienstag 2. April 2019, 12:36 ...
Ich könnte dir eine E-Mail schreiben, mit Absender "steve.jobs@apple.com" und sogar die "To"-Adresse verändern, dein E-Mail-Client würde dir also eine andere Empfängeradresse anzeigen (was geht, aber nicht sinnvoll ist).
...
Über die Problematik mit den fälschbaren Absenderdaten, inkl. IP-Adresse, habe gelesen. Was ich jedoch meine Verstanden zu haben ist, dass es nicht möglich ist die IP-Adresse des Mailservers zu unterdrücken von dem die eMail versandt wurde. D.h. dass eine gefälschte eMail immer eine zusätzliche IP-Adresse hat, die nicht vom vorgetäuschten Absender stammt.
Daher mein vorgehen, alle Received Einträge auf eine nicht gelistete IP-Adresse zu untersuchen. Sobald eine IP vorhanden ist die nicht in der "Positivliste" steht wird die eMail nicht verarbeitet. Ist vielleicht nicht die sicherste Methode, jedoch die Einzige die mir, zum jetzigen Zeitpunkt, mit vertretbarem Zeit- und Einarbeitungs-Aufwand einfällt.
das Schönste am Programmieren ist, dass man mit Ausdauer und Hartnäckigkeit am Ende immer belohnt wird. :mrgreen:
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Eben nicht. Ein Gateway kann da als IP-Adresse eintragen was es will. Alles was du dort in der E-Mail siehst besteht aus Header + Body, das ist im Grunde genommen nichts anderes als ein langer String. Ein Gateway dahingehend zu ändern dass er valide IPs einträgt, ist nicht schwierig. Auf Mime-Ebene sind dir da etwas die Hände gebunden. Mit DKIM hast du mehr Möglichkeiten, weil dort u.a. Hashes der Header und Header + Body gebildet werden, die nach der Zustellung abgeglichen werden können etc.

Nochmal, was willst du überprüfen? Es ist IMHO einfach nicht sinnvoll solange du lokal herum werkelst. Es sei denn du vertraust deinen Mitarbeitern nicht. Jeder MTA tut ja nur das was man ihm sagt. Du kannst also nicht einfach einen MTA dazwischenklemmen in der Hoffnung dass andere an diesen zustellen.
When we say computer, we mean the electronic computer.
Antworten