Как мне узнать «От» письма? (Используя IMAP) - PullRequest
0 голосов
/ 03 мая 2018

В этом случае я загружаю простой текст из электронного письма с критериями,
но откуда мне знать адрес @ gmail.com, который его отправил. Я использую Python 3.5.4

import imaplib
import email

mail = imaplib.IMAP4_SSL('imap.gmail.com')
#imaplib module implements connection based on IMAPv4 protocol
mail.login('myemail', 'mypassword')


mail.list() # Lists all labels in GMail
mail.select('inbox') # Connected to inbox.


result, data = mail.uid('search', None, '(HEADER Subject "[News]")')
#search and return uids instead
i = len(data[0].split()) # data[0] is a space separate string
for x in range(i):
   latest_email_uid = data[0].split()[x] # unique ids wrt label selected
   result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)')
   # fetch the email body (RFC822) for the given ID
   raw_email = email_data[0][1]

 #From = email.utils.parseaddr(email_data['From'])
 #continue inside the same for loop as above
raw_email_string = raw_email.decode('utf-8')
# converts byte literal to string removing b''
email_message = email.message_from_string(raw_email_string)
#this will loop through all the available multiparts in mail
for part in email_message.walk():
 if part.get_content_type() == "text/plain": # ignore attachments/html
     enter code here`body = part.get_payload(decode=True)
     save_string = str("Llave de amigo" + str(x) + str("a"))
     # location on disk
     myfile = open(save_string, 'a')
     myfile.write(body.decode('utf-8'))
     # body is again a byte literal
     myfile.close()

1 Ответ

0 голосов
/ 04 мая 2018

Это, возможно, не очевидно из документации (при условии Python 2.7), но объект email_message действует как dict, реализуя функцию __getitem__. Так как вы получили и проанализировали все сообщение, вы можете получить к нему доступ просто как:

email_message['from']

Обратите внимание, это дает вам необработанное представление заголовка, что, вероятно, хорошо во многих случаях.

Затем вы можете использовать email.utils.parseaddr, чтобы разбить его на составные части:

realname, addr = email.utils.parseaddr(email_message['from')).

email.utils.getaddresses может быть полезно, если вы затем анализируете заголовки To или Cc с более чем одним получателем.

Если вам нужно иметь дело с интернационализированными заголовками в старых версиях Python, можно использовать email.header.decode_header и email.header.make_header.

В Python3.6 это значительно изменилось и должно быть более простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...