Проверка подлинности Gmail IMAP - imaplib.authenticate занимает ровно 3 аргумента (4 дано) - PullRequest
1 голос
/ 01 ноября 2011

Я пытаюсь включить доступ к Gmail IMAP из моего веб-приложения. Прямо сейчас пользователи могут предоставлять доступ к веб-приложению, успешно извлекая и сохраняя токен и секрет пользователя. Но когда я пытаюсь аутентифицировать соединение IMAP для получения электронной почты, выдается следующее сообщение:

TypeError: authenticate() takes exactly 3 arguments (4 given)

Вот код (очень простой):

import oauth2 as oauth
import imaplib

consumer = oauth.Consumer('token','secret')
token = oauth.Token('token','secret')

url = "https://mail.google.com/mail/b/username@gmail.com/imap/"
conn = imaplib.IMAP4_SSL('imap.googlemail.com')
conn.debug = 4
conn.authenticate(url,consumer,token)

Я попытался немного отступить, чтобы избежать действительной функции authenticate, но безрезультатно:

imaplib.IMAP4_SSL.authenticate(conn,'XOAUTH',lambda x: oauth.build_xoauth_string(url,consumer,token))

Это дает мне похожий вывод:

29:03.17 > CMIK6 AUTHENTICATE XOAUTH
29:03.27 < CMIK5 BAD Too many arguments provided s68if10067716yhm.26
29:03.27 BAD response: Too many arguments provided s68if10067716yhm.26

Я не уверен, в чем может быть проблема. Почему функция authenticate считает, что было 4 аргумента? Могут ли строки oauth быть интерпретированы как несколько строк, то есть не экранированы должным образом? У них есть косая черта, знак подчеркивания, знак плюс, но нет запятых.

Есть еще идеи?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

При использовании oauth2 для IMAP его необходимо использовать вместе с oauth2.clients.imap, поэтому:

import oauth2 as oauth
import oauth2.clients.imap as imaplib

# the rest of your code as it was

Вы можете увидеть пример внизу этой страницы: https://github.com/simplegeo/python-oauth2

1 голос
/ 01 ноября 2011

Метод authenticate принимает только 2 аргумента (3, если вы включаете self). Эта статья объясняет, как это работает (документы не очень полезны).

Ваша вторая попытка выглядит многообещающе, если вы просто предоставите 2 аргумента:

conn.authenticate('XOAUTH',lambda x: oauth.build_xoauth_string(url,consumer,token))

Надеюсь, это поможет.

ОБНОВЛЕНИЕ - ИГНОРИРУЕТСЯ ВЫШЕ

Не обращайте внимания на все это, я думаю, я знаю, в чем проблема. Похоже, вы берете свой пример из пакета python-oauth2 . В приведенном ими примере используется не стандартная библиотека Python imaplib, а собственная реализация.

Вам необходимо использовать клиент python-oauth2 imap:

import oauth2.clients.imap as imaplib

Вот соответствующий раздел из их примера - который действительно требует 3 аргумента, как в вашем примере:

# This is the only thing in the API for impaplib.IMAP4_SSL that has 
# changed. You now authenticate with the URL, consumer, and token.
conn.authenticate(url, consumer, token)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...