Python dict KeyError 'RFC822' - IMAPClient для Gmail - PullRequest
1 голос
/ 05 марта 2020

Итак, я новичок в кодировании, и я выбрал Python, чтобы начать. Я пытаюсь собрать сценарий, чтобы получить «дату» последнего письма, полученного от определенного контакта. Эта «дата» будет затем сохранена в листе Google.

Ниже приведен код, который у меня есть, который касается только части Gmail. Я фактически использовал часть кода из здесь . Однако я получаю сообщение об ошибке

Traceback (последний вызов был последним): файл "C: / Users / PycharmProjects / Automate / Code.py", строка 33, в msg_string = data [ 'RFC822'] KeyError: 'RFC822'

Не уверен, что происходит не так. Я использую Python 3.8.1

import email
from imapclient import IMAPClient

HOST = 'imap.gmail.com'
USERNAME = 'username'
PASSWORD = 'password'
ssl = True

## Connect, login and select the INBOX
server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)
select_info = server.select_folder('INBOX')

messages = server.search(['FROM', 'email_of_the_contact@gmail.com'])

response = server.fetch(messages, ['RFC822'])

for msgid, data in response.items():
    msg_string = data['RFC822']
    msg = email.message_from_string(msg_string)
    print('ID %d: From: %s Date: %s' % (msgid, msg['From'], msg['date']))

Кроме того, я не уверен, что код завершен с точки зрения того, чего я пытаюсь достичь. Любая помощь приветствуется.

Кроме того, добавление в сообщение, полученное от отладки

pydev debugger: process 344 is connecting

Connected to pydev debugger (build 193.6494.30)
Traceback (most recent call last):
  File "C:\Users\PycharmProjects\Automate\venv\lib\site-packages\httplib2\__init__.py", line 1557, in _conn_request
    conn.connect()
  File "C:\Users\PycharmProjects\Automate\venv\lib\site-packages\httplib2\__init__.py", line 1305, in connect
    address_info = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)
  File "C:\Program Files (x86)\Python38-32\lib\socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\PycharmProjects\Automate\venv\lib\site-packages\httplib2\__init__.py", line 1982, in request
    (response, content) = self._request(
  File "C:\Users\PycharmProjects\Automate\venv\lib\site-packages\httplib2\__init__.py", line 1650, in _request
    (response, content) = self._conn_request(
  File "C:\Users\PycharmProjects\Automate\venv\lib\site-packages\httplib2\__init__.py", line 1564, in _conn_request
    raise ServerNotFoundError("Unable to find the server at %s" % conn.host)
httplib2.ServerNotFoundError: Unable to find the server at oauth2.googleapis.com

Process finished with exit code -1

1 Ответ

2 голосов
/ 05 марта 2020

Здесь я пробежал ваш код, чтобы повторить ту же ошибку, и получил ту же ошибку.

Чтобы устранить проблему, я проверил ключи dict и заметил, что ключи и значения dict кодируются как байты.

Итак, я использовал байтовый ключ для доступа и декодирования для перевода сообщения в str, как:

import email
from imapclient import IMAPClient

HOST = 'imap.gmail.com'
USERNAME = 'username'
PASSWORD = 'password'
ssl = True

## Connect, login and select the INBOX
server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)
select_info = server.select_folder('INBOX')

messages = server.search(['FROM', 'email_of_the_contact@gmail.com'])

response = server.fetch(messages, ['RFC822'])

for msgid, data in response.items():
    msg_string = data[b'RFC822']
    msg = email.message_from_string(msg_string.decode())
    print('ID %d: From: %s Date: %s' % (msgid, msg['From'], msg['date']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...