Чтение электронной почты Gmail на Python

#python #python-3.x #email #gmail #imap

#python #python-3.x #Адрес электронной почты #gmail #imap

Вопрос:

Я пытаюсь создать простой скрипт для проверки моего Gmail на наличие электронных писем с определенным заголовком. Когда я запускаю эту программу на Python 3.7.3, я получаю эти данные : ('OK', [b'17']) .

Мне нужно получить доступ к телу электронной почты в python. Я просто не уверен, что делать с имеющимися у меня данными.

Вот мой текущий код:

 import imaplib
import credentials

imap_ssl_host = 'imap.gmail.com'
imap_ssl_port = 993
username = credentials.email
password = credentials.passwd
server = imaplib.IMAP4_SSL(imap_ssl_host, imap_ssl_port)

server.login(username, password)
server.select('INBOX')

data = server.uid('search',None, '(SUBJECT "MY QUERY HERE!")')
print(data)
  

Результат выполнения кода:

 ('OK', [b'17'])
  

Я знаю, что это немного грубо, но я все еще учусь, поэтому буду признателен за любые советы, которые помогут мне улучшить!

Комментарии:

1. Не будет ли API лучше в долгосрочной перспективе? developers.google.com/gmail/api/quickstart/python

Ответ №1:

Сначала вам нужно перечислить содержимое выбранного почтового ящика и выбрать один из элементов. Вы могли бы сделать что-то подобное (также проверьте ссылку, предложенную @asynts)

     imap.select('Inbox')
    status, data = imap.search(None, 'ALL')
    for num in data[0].split():
      status, data = imap.fetch(num, '(RFC822)')
      email_msg = data[0][1]
  

Если вам нужны только определенные поля в теле, вместо синтаксического анализа RFC вы можете фильтровать такие поля, как:

     status, data = imap.fetch(num, '(BODY[HEADER.FIELDS (SUBJECT DATE FROM TO)])')
  

Комментарии:

1. Это сработало! Теперь я могу запустить «печать (email_msg)» в конце моей программы, и это дает мне информацию в заголовке моего письма. Однако у меня есть два вопроса. Есть ли какой-либо способ получить доступ к тексту письма? Есть ли список команд, на которые я могу ссылаться для функции «imap.fetch»? Когда я говорю список команд, я имею в виду, как вы узнали, что нужно поместить в круглые скобки функции «imap.fetch()»? Извините за мое невежество. Я все еще учусь. Спасибо за вашу помощь!

2. imaplib — это библиотека низкого уровня. Вам нужно будет понять намного больше (например, RFC 3501), чтобы знать, что нужно поместить. В качестве альтернативы вы можете попробовать что-то более высокого уровня. Я слышал, что люди используют imapclient здесь; или используйте HTTP-API gmail, которые, вероятно, легче понять

3. Спасибо за совет, Макс. Если я хочу найти тело, а не заголовок, не могли бы вы предложить мне поискать в API-интерфейсах HTTP gmail?

4. user.message имеет поле тела в HTTP. Я сам этим не пользовался. Но в руководствах и документации есть встроенные кнопки HTTP «Попробуйте» для экспериментов. Вы могли бы начать здесь, developers.google.com/gmail/api/v1/reference/users/messages/get или вернитесь назад и прочтите несколько обзорных руководств.