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 它工作正常。