#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 или вернитесь назад и прочтите несколько обзорных руководств.