Es scheint leicht zu bekommen
From
To
Subject
usw. über
import email
b = email.message_from_string(a)
bbb = b['from']
ccc = b['to']
Angenommen, dies "a"
ist die Raw-E-Mail-Zeichenfolge, die ungefähr so aussieht.
a = """From [email protected] Thu Jul 25 19:28:59 2013
Received: from a1.local.tld (localhost [127.0.0.1])
by a1.local.tld (8.14.4/8.14.4) with ESMTP id r6Q2SxeQ003866
for <[email protected]>; Thu, 25 Jul 2013 19:28:59 -0700
Received: (from root@localhost)
by a1.local.tld (8.14.4/8.14.4/Submit) id r6Q2Sxbh003865;
Thu, 25 Jul 2013 19:28:59 -0700
From: [email protected]
Subject: oooooooooooooooo
To: [email protected]
Cc:
X-Originating-IP: 192.168.15.127
X-Mailer: Webmin 1.420
Message-Id: <1374805739.3861@a1>
Date: Thu, 25 Jul 2013 19:28:59 -0700 (PDT)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="bound1374805739"
This is a multi-part message in MIME format.
--bound1374805739
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
ooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooo
--bound1374805739--"""
DIE FRAGE
Wie kommt man Body
von dieser E-Mail über Python?
Bisher ist dies der einzige Code, den ich kenne, aber ich muss ihn noch testen.
if email.is_multipart():
for part in email.get_payload():
print part.get_payload()
else:
print email.get_payload()
Ist das der richtige Weg?
oder vielleicht gibt es etwas einfacheres wie ...
import email
b = email.message_from_string(a)
bbb = b['body']
?
.get_payload(decode=True)
anstatt nur.get_payload()
das Leben viel einfacher gemacht zu haben, danke!Es ist ein sehr gutes Paket verfügbar, um den E-Mail-Inhalt mit der richtigen Dokumentation zu analysieren.
import mailparser mail = mailparser.parse_from_file(f) mail = mailparser.parse_from_file_obj(fp) mail = mailparser.parse_from_string(raw_mail) mail = mailparser.parse_from_bytes(byte_mail)
Wie benutzt man:
quelle
MailParser
und diese überschreibt , da sie die Teile des E-Mail-Body mit "\ n --- mail_boundary --- \ n" verbindet, was für mich nicht ideal war.Python 3.6+ bietet integrierte Komfortmethoden zum Suchen und Dekodieren des Nur-Text-Körpers wie in
@Todor Minakov
der Antwort. Sie können die MethodenEMailMessage.get_body()
undget_content()
verwenden:msg = email.message_from_string(s, policy=email.policy.default) body = msg.get_body(('plain',)) if body: body = body.get_content() print(body)
Beachten Sie, dass dies gegeben ist,
None
wenn kein (offensichtlicher) Klartextkörperteil vorhanden ist.Wenn Sie beispielsweise aus einer Mbox-Datei lesen, können Sie dem Postfachkonstruktor eine
EmailMessage
Factory geben:mbox = mailbox.mbox(mboxfile, factory=lambda f: email.message_from_binary_file(f, policy=email.policy.default), create=False) for msg in mbox: ...
Beachten Sie, dass Sie
email.policy.default
als Richtlinie übergeben müssen, da dies nicht die Standardeinstellung ist ...quelle
email.policy.default
die Standardeinstellung? Scheint so zu sein.Es gibt keine
b['body']
in Python. Sie müssen get_payload verwenden.if isinstance(mailEntity.get_payload(), list): for eachPayload in mailEntity.get_payload(): ...do things you want... ...real mail body is in eachPayload.get_payload()... else: ...means there is only text/plain part.... ...use mailEntity.get_payload() to get the body...
Viel Glück.
quelle
Wenn E-Mails der Pandas-Datenrahmen und E-Mails sind, geben Sie die Spalte für den E-Mail-Text an
## Helper functions def get_text_from_email(msg): '''To get the content from email objects''' parts = [] for part in msg.walk(): if part.get_content_type() == 'text/plain': parts.append( part.get_payload() ) return ''.join(parts) def split_email_addresses(line): '''To separate multiple email addresses''' if line: addrs = line.split(',') addrs = frozenset(map(lambda x: x.strip(), addrs)) else: addrs = None return addrs import email # Parse the emails into a list email objects messages = list(map(email.message_from_string, emails['message'])) emails.drop('message', axis=1, inplace=True) # Get fields from parsed email objects keys = messages[0].keys() for key in keys: emails[key] = [doc[key] for doc in messages] # Parse content from emails emails['content'] = list(map(get_text_from_email, messages)) # Split multiple email addresses emails['From'] = emails['From'].map(split_email_addresses) emails['To'] = emails['To'].map(split_email_addresses) # Extract the root of 'file' as 'user' emails['user'] = emails['file'].map(lambda x:x.split('/')[0]) del messages emails.head()
quelle
Hier ist der Code, der jedes Mal für mich funktioniert (für Outlook-E-Mails):
#to read Subjects and Body of email in a folder (or subfolder) import win32com.client #import package outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") #create object #get to the desired folder ([email protected] is my root folder) root_folder = outlook.Folders['[email protected]'].Folders['Inbox'].Folders['SubFolderName'] #('Inbox' and 'SubFolderName' are the subfolders) messages = root_folder.Items for message in messages: if message.Unread == True: # gets only 'Unread' emails subject_content = message.subject # to store subject lines of mails body_content = message.body # to store Body of mails print(subject_content) print(body_content) message.Unread = True # mark the mail as 'Read' message = messages.GetNext() #iterate over mails
quelle