Проверка подлинности Gmail по протоколу IMAP — imaplib.authenticate занимает ровно 3 аргумента (задано 4)

#python #oauth #gmail

#python #oauth #gmail

Вопрос:

Я пытаюсь включить доступ к 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 интерпретироваться как несколько строк, т.Е. Не экранироваться должным образом? У них есть косые черты, подчеркивания, знаки плюс, но нет запятых.

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

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

1. Вы пробовали использовать оболочку oauth2 imaplib? import oauth2.clients.imap as imaplib

2. authenticate conn я думаю, это метод, self это первый аргумент.

3. @Acorn, который, похоже, сделал свое дело. Я все еще немного играю с этим, но по какой-то причине он не выдает ту же ошибку.

4. @Acorn пожалуйста, укажите свой комментарий в качестве ответа, и я дам вам чек.

Ответ №1:

При использовании 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

Ответ №2:

Метод аутентификации принимает только 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)