Как получить письма из Gmail?
Требуется получить письмо из Gmail. Пробовал следующий код:
import imaplib, email
def read_email_from_gmail():
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected]','mypass')
mail.select('inbox')
type, data = mail.search(None, 'ALL')
mail_ids = data[0]
id_list = mail_ids.split()
first_email_id = int(id_list[0])
latest_email_id = int(id_list[-1])
for i in range(latest_email_id,first_email_id, -1):
type, data = mail.fetch(str(i), '(RFC822)' )
for response_part in data:
if isinstance(response_part, tuple):
test = str(response_part)
msg = email.message_from_string(test)
email_subject = msg['subject']
email_from = msg['from']
print('From : ' + email_from + '\n')
print('Subject : ' + email_subject + '\n')
read_email_from_gmail()
Он не сработал. Как реализовать?
PS (прим.ред.: перенесено из комментария)
Но попробуем на примере этого кода. При запуске выдаёт следующую ошибку:
print('From : ' + email_from + '\n');
TypeError: can only concatenate str (not "NoneType") to str".
Поправил, заменив print('From : ' + email_from + '\n') на print(email_from).
В итоге код зацикливается, выводя None. К тому же, в вопросе явно указано "как реализовать", а не "как исправить данный код"
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Пример:
import re
сначала выбираем папку All Mail:
In [311]: folder = [re.sub(r'.*?("\[G[^"]*").*', r'\1', f.decode("utf-8")) for f in mail.list()[1] if br"\All " in f][0]
In [312]: mail.select(folder)
Out[312]: ('OK', [b'9355'])
ищем письма, в заголовке которых содержится слово "test":
In [313]: typ, data = mail.search(None, '(SUBJECT "test")')
список ID найденных писем:
In [314]: data
Out[314]: [b'1873 1875 1876 1878 1879 3047 3088 4607 4625 5176 5299 5681 7074 8667 9261']
читаем и парсим одно из найденных писем:
In [315]: typ, d = mail.fetch('1879', '(RFC822)')
In [316]: msg = email.message_from_bytes(d[0][1])
результат:
In [317]: msg["subject"]
Out[317]: 'Re: test'
In [318]: msg["from"]
Out[318]: 'Max ****** <max.******@gmail.com>'
In [324]: msg.keys()
Out[324]:
['MIME-Version',
'Received',
'In-Reply-To',
'References',
'Date',
'Delivered-To',
'Message-ID',
'Subject',
'From',
'To',
'Content-Type',
'Content-Transfer-Encoding']
In [325]: msg["Received"]
Out[325]: 'by 10.86.83.11 with HTTP; Tue, 27 Jan 2009 02:39:15 -0800 (PST)'
In [327]: msg["Content-Transfer-Encoding"]
Out[327]: 'base64'