#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)