У меня был рабочий IMAP-клиент для почты Google, однако он недавно прекратил работать. Я считаю, что проблема в том, что gmail больше не позволяет вводить имена пользователей и пользователей TTL, но теперь требуется OAuth2.0.
Я хотел бы знать, как лучше всего изменить мой пример ниже, чтобы мой скрученный клиент IMAP аутентифицировался с использованием OAuth2.0. (И делать это без пакетов API Google, если это возможно.)
Пример использования имени пользователя/пароля (больше не работает)
class AriSBDGmailImap4Client(imap4.IMAP4Client):
'''
client to fetch and process SBD emails from gmail. the messages
contained in the emails are sent to the AriSBDStationProtocol for
this sbd modem.
'''
def __init__(self, contextFactory=None):
imap4.IMAP4Client.__init__(self, contextFactory)
@defer.inlineCallbacks
def serverGreeting(self, caps):
# log in
try:
# the line below no longer works for gmail
yield self.login(mailuser, mailpass)
try:
yield self.uponAuthentication()
except Exception as e:
uponFail(e, "uponAuthentication")
except Exception as e:
uponFail(e, "logging in")
# done. log out
try:
yield self.logout()
except Exception as e:
uponFail(e, "logging out")
@defer.inlineCallbacks
def uponAuthentication(self):
try:
yield self.select('Inbox')
try:
# read messages, etc, etc
pass
except Exception as e:
uponFail(e, "searching unread")
except Exception as e:
uponFail(e, "selecting inbox")
У меня есть тривиальный factory для этого клиента. Он запускается с помощью reactor.connectSSL
с URL-адресом хоста и порталом электронной почты Google.
Я следил за указаниями https://developers.google.com/gmail/api/quickstart/quickstart-python для "установленного приложения" (но я не знаю, был ли это правильный выбор). Я могу успешно запустить их "quickstart.py".
Моя быстрая и грязная попытка (не работает)
@defer.inlineCallbacks
def serverGreeting(self, caps):
# log in
try:
#yield self.login(mailuser, mailpass)
flow = yield threads.deferToThread(
oauth2client.client.flow_from_clientsecrets,
filename=CLIENT_SECRET_FILE,
scope=OAUTH_SCOPE)
http = httplib2.Http()
credentials = yield threads.deferToThread( STORAGE.get )
if credentials is None or credentials.invalid:
parser = argparse.ArgumentParser(
parents=[oauth2client.tools.argparser])
flags = yield threads.deferToThread( parser.parse_args )
credentials = yield threads.deferToThread(
oauth2client.tools.run_flow,
flow=flow,
storage=STORAGE,
flags=flags, http=http)
http = yield threads.deferToThread(
credentials.authorize, http)
gmail_service = yield threads.deferToThread(
apiclient.discovery.build,
serviceName='gmail',
version='v1',
http=http)
self.state = 'auth'
try:
yield self.uponAuthentication()
except Exception as e:
uponFail(e, "uponAuthentication")
except Exception as e:
uponFail(e, "logging in")
# done. log out
try:
yield self.logout()
except Exception as e:
uponFail(e, "logging out")
В основном я просто скопировал "quickstart.py" в serverGreeting
, а затем попытался установить состояние клиента в "auth".
Это аутентифицируется просто отлично, но затем скрученный не может выбрать папку "Входящие":
[AriSBDGmailImap4Client (TLSMemoryBIOProtocol), клиент] FAIL: Неизвестная команда {random gibberish}
Случайная бред содержит буквы и цифры и различается при каждом сбое команды select inbox.
Спасибо за вашу помощь!