GMail API Python 和 Encoding/Decoding
GMail API Python and Encoding/Decoding
我正在尝试使用 Google 提供的 API 使用 Python 3.4.
阅读我的 GMail 邮件
我正在使用 Google 在 this link:
提供的这个功能
def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()
print 'Message snippet: %s' % message['snippet']
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_string(msg_str)
return mime_msg
except errors.HttpError, error:
print 'An error occurred: %s' % error
但是,如果我按原样使用此函数,则会出现以下错误:
TypeError: initial_value must be str or None, not bytes
所以我稍微改变了函数:
def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()
#print ('Message snippet: %s' % message['snippet'])
msg_str = base64.urlsafe_b64decode(message['raw'].encode('utf-8','ignore'))
print(msg_str)
mime_msg = email.message_from_string(msg_str.decode('utf-8','ignore'))
return mime_msg
except errors.HttpError:
print('An error occurred')
如果我不添加 'ignore' 参数,我会收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xeb in position
2214: invalid continuation byte
如果我使用 'ignore' 参数,那么邮件的内容,例如 HTML 文本,会包含一些奇怪的字符,例如:
=09=09body=2C#bodyTable=2C#bodyCell{
=09=09=09height:100% !important;
=09=09=09margin:0;
=09=09=09padding:0;
=09=09=09width:100% !important;
=09=09}
我的问题似乎与 this one 非常相似,但是鉴于我不是 Python 专家并且我需要使用 GMail API,我不知道如何解决它。
有什么想法吗?
看来邮件内容是引用打印编码。
可以使用quopri模块来处理https://docs.python.org/2/library/quopri.html
正如 Arkanus 所说,问题与可引用打印的编纂有关。
我没有使用 quopri,而是使用 decode 参数来实现类似于 this one.
的代码
第一个错误是由于我使用的是 Python 3.4。我不确定原因,但使用 Python 2.7 它工作正常。
我正在尝试使用 Google 提供的 API 使用 Python 3.4.
阅读我的 GMail 邮件我正在使用 Google 在 this link:
提供的这个功能def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()
print 'Message snippet: %s' % message['snippet']
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_string(msg_str)
return mime_msg
except errors.HttpError, error:
print 'An error occurred: %s' % error
但是,如果我按原样使用此函数,则会出现以下错误:
TypeError: initial_value must be str or None, not bytes
所以我稍微改变了函数:
def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()
#print ('Message snippet: %s' % message['snippet'])
msg_str = base64.urlsafe_b64decode(message['raw'].encode('utf-8','ignore'))
print(msg_str)
mime_msg = email.message_from_string(msg_str.decode('utf-8','ignore'))
return mime_msg
except errors.HttpError:
print('An error occurred')
如果我不添加 'ignore' 参数,我会收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xeb in position 2214: invalid continuation byte
如果我使用 'ignore' 参数,那么邮件的内容,例如 HTML 文本,会包含一些奇怪的字符,例如:
=09=09body=2C#bodyTable=2C#bodyCell{
=09=09=09height:100% !important;
=09=09=09margin:0;
=09=09=09padding:0;
=09=09=09width:100% !important;
=09=09}
我的问题似乎与 this one 非常相似,但是鉴于我不是 Python 专家并且我需要使用 GMail API,我不知道如何解决它。 有什么想法吗?
看来邮件内容是引用打印编码。
可以使用quopri模块来处理https://docs.python.org/2/library/quopri.html
正如 Arkanus 所说,问题与可引用打印的编纂有关。
我没有使用 quopri,而是使用 decode 参数来实现类似于 this one.
的代码第一个错误是由于我使用的是 Python 3.4。我不确定原因,但使用 Python 2.7 它工作正常。