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



这是我的脚本,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=%s1auth=Bearer %s11' % (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('---------@gmail.com', access_token, as_base64=True)
test_imap('---------@gmail.com', 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_scriptmail_send.py", line 148, in <module>
test_imap('---------@gmail.com', auth_string)
File "E:path_to_scriptmail_send.py", line 78, in test_imap
imap_conn.authenticate('XOAUTH2 ', lambda x: auth_string)
File "C:UsersusernameAppDataLocalProgramsPythonPython37libimaplib.py", line 428, in authenticate
typ, dat = self._simple_command('AUTHENTICATE', mech)
File "C:UsersusernameAppDataLocalProgramsPythonPython37libimaplib.py", line 1196, in _simple_command
return self._command_complete(name, self._command(name, *args))
File "C:UsersusernameAppDataLocalProgramsPythonPython37libimaplib.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天了,我再也不这样做了:[]

解决方案是我的auth_string是as_base64编码,但imap想要'未编码' auth_string

access_token, expires_in = refresh_authorization(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REFRESH_TOKEN)auth_string = generate_oauth2_string('---------@gmail.com', access_token, as_base64=False)

test_imap ('---------@ gmail.com, auth_string)

尝试一步一步:

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)

这将测试IMAP4_SSL与Gmail对您的凭据(没有OAUTH2,所以验证此配置已启用)。

如果这样可以工作,而XOAUTH2不能,那么显然我必须质疑您的声明,即验证字符串是正确的。

例如,您返回的错误似乎指的是mail.google.com的范围,而我期望的是imap.google.com。这是正确的吗?

另外,'XOAUTH2'之后的额外空间是打字错误,还是在原始代码中?这可能会扰乱算法的选择机制。

您可能希望从Google Python XOAUTH2样例代码重新启动并从那里构建。

最新更新