Wydaje się, że łatwo jest uzyskać plik
From
To
Subject
itp. za pośrednictwem
import email
b = email.message_from_string(a)
bbb = b['from']
ccc = b['to']
zakładając, że "a"
jest to nieprzetworzony ciąg wiadomości e-mail, który wygląda mniej więcej tak.
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--"""
PYTANIE
jak otrzymujesz Body
ten e-mail przez Pythona?
Jak dotąd jest to jedyny kod, o którym wiem, ale jeszcze go nie przetestowałem.
if email.is_multipart():
for part in email.get_payload():
print part.get_payload()
else:
print email.get_payload()
czy to jest właściwy sposób?
a może jest coś prostszego, na przykład ...
import email
b = email.message_from_string(a)
bbb = b['body']
?
.get_payload(decode=True)
zamiast tylko.get_payload()
znacznie ułatwiło życie, dzięki!Dostępny jest bardzo dobry pakiet do analizowania treści wiadomości e-mail z odpowiednią dokumentacją.
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)
Jak używać:
mail.attachments: list of all attachments mail.body mail.to
źródło
MailParser
i zastępuje metodę body , ponieważ łączy ona części treści wiadomości e-mail z „\ n --- mail_boundary --- \ n”, co nie było dla mnie idealne.Python 3.6+ zapewnia wbudowane wygodne metody wyszukiwania i dekodowania treści zwykłego tekstu, tak jak w
@Todor Minakov
odpowiedzi. Możesz użyć metodEMailMessage.get_body()
iget_content()
:msg = email.message_from_string(s, policy=email.policy.default) body = msg.get_body(('plain',)) if body: body = body.get_content() print(body)
Zauważ, że da to,
None
jeśli nie ma (oczywistej) części treści w postaci zwykłego tekstu.Jeśli czytasz np. Z pliku mbox, możesz nadać konstruktorowi skrzynki pocztowej
EmailMessage
fabrykę:mbox = mailbox.mbox(mboxfile, factory=lambda f: email.message_from_binary_file(f, policy=email.policy.default), create=False) for msg in mbox: ...
Uwaga należy zdać
email.policy.default
jak polityka, ponieważ jest to nie domyślny ...źródło
email.policy.default
to ustawienie domyślne? Wydaje się, że tak powinno być.W
b['body']
Pythonie nie ma . Musisz użyć get_payload.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...
Powodzenia.
źródło
Jeśli e-maile to panda dataframe, a e-maile. Wiadomość w kolumnie dla tekstu wiadomości e-mail
## 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()
źródło
Oto kod, który działa dla mnie za każdym razem (w przypadku wiadomości e-mail programu Outlook):
#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
źródło