我如何使用python通过imap从gmail获取邮件

问题描述 投票:0回答:2

这是我的脚本,auth_string是正确的,我尝试了这个 smtplib.SMTP('smtp.gmail.com:587') 并且它有效,imap 在我的 gmail 设置中处于激活状态,是的,请帮助我:)

def command_to_url(command):
    return '%s/%s' % (GOOGLE_ACCOUNTS_BASE_URL, command)

def call_refresh_token(client_id, client_secret, refresh_token):
    params = {}
    params['client_id'] = client_id
    params['client_secret'] = client_secret
    params['refresh_token'] = refresh_token
    params['grant_type'] = 'refresh_token'
    request_url = command_to_url('o/oauth2/token')
    response = urllib.request.urlopen(request_url, urllib.parse.urlencode(params).encode('UTF-8')).read().decode('UTF-8')
    return json.loads(response)

def refresh_authorization(google_client_id, google_client_secret, refresh_token):
    response = call_refresh_token(google_client_id, google_client_secret, refresh_token)
    return response['access_token'], response['expires_in']

def generate_oauth2_string(username, access_token, as_base64=False):
    auth_string = 'user=%s\1auth=Bearer %s\1\1' % (username, access_token)
    if as_base64:
        auth_string = base64.b64encode(auth_string.encode('ascii')).decode('ascii')
    return auth_string

def test_imap(user, auth_string):
    imap_conn = imaplib.IMAP4_SSL('imap.gmail.com', port=993)
    imap_conn.debug = 4
    imap_conn.authenticate('XOAUTH2 ', lambda x: auth_string)

access_token, expires_in = refresh_authorization(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN)
auth_string = generate_oauth2_string('[email protected]', access_token, as_base64=True)

test_imap('[email protected]', auth_string)

response:
  30:07.30 > b'KOHE1 AUTHENTICATE XOAUTH2 '
  30:07.32 < b'+ '
  30:07.32 write literal size 376
  30:07.41 < b'+ eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ=='
  30:07.41 write literal size 376
  30:07.48 < b'KOHE1 BAD Invalid SASL argument. q16mb213626858wmq'
  30:07.48 BAD response: b'Invalid SASL argument. q16mb213626858wmq'
Traceback (most recent call last):
  File "E:\path_to_script\mail_send.py", line 148, in <module>
    test_imap('[email protected]', auth_string)
  File "E:\path_to_script\mail_send.py", line 78, in test_imap
    imap_conn.authenticate('XOAUTH2 ', lambda x: auth_string)
  File "C:\Users\username\AppData\Local\Programs\Python\Python37\lib\imaplib.py", line 428, in authenticate
    typ, dat = self._simple_command('AUTHENTICATE', mech)
  File "C:\Users\username\AppData\Local\Programs\Python\Python37\lib\imaplib.py", line 1196, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "C:\Users\username\AppData\Local\Programs\Python\Python37\lib\imaplib.py", line 1027, in _command_complete
    raise self.error('%s command error: %s %s' % (name, typ, data))
imaplib.error: AUTHENTICATE command error: BAD [b'Invalid SASL argument. q16mb213626858wmq']

我已经尝试了 3 天,但现在不再尝试了:[]

python imap gmail-imap
2个回答
1
投票

解决方案是我的 auth_string 已编码,但 imap 想要“未编码”

as_base64
auth_string



0
投票

access_token, expires_in = refresh_authorization(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN) auth_string = generate_oauth2_string('[email protected]', access_token, as_base64=False) test_imap('[email protected]', auth_string)

这将根据您的凭据测试 Gmail 的 IMAP4_SSL(没有 OAUTH2,因此请验证此配置是否启用)。

如果这有效,而 XOAUTH2 不起作用,那么很明显,我必须质疑您关于身份验证字符串是否正确的说法。

例如,您返回的错误似乎涉及

M = imaplib.IMAP4_SSL('imap.gmail.com') try: rv, data = M.login(EMAIL_ACCOUNT, EMAIL_PASSWORD) except imaplib.IMAP4.error: print "Login failed." sys.exit(1)

的范围,而我预期是

mail.google.com
。这是正确的吗?
另外,“XOAUTH2”后面的额外空格是拼写错误还是在原始代码中?这可能会扰乱算法选择机制。

您可能想从

Google Python XOAUTH2 示例代码

重新开始并从那里开始构建。

© www.soinside.com 2019 - 2024. All rights reserved.