GMail API Python 和编码/解码

5

我试图使用Google提供的Python 3.4 API 读取我的GMail邮件。

我正在使用Google在this链接中提供的此函数:

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' 编解码器无法解码字节0xeb,位于位置2214:无效的继续字节
如果我使用“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,我不知道如何修复它。有什么想法吗?
2个回答

2

0

正如Arkanus所建议的那样,问题与可打印引用编码有关。

我使用了解码参数来实现类似于this one的代码,而不是使用quopri。

第一个错误是由于我使用的是Python 3.4造成的。我不确定原因,但在使用Python 2.7时它可以正常工作。


处理邮件时的一般最佳实践是检查“Content-Type”和“Content-Transfer-Encoding”头;我不知道GMail API如何格式化其输出,但您可能还会遇到其他字符集和编码的邮件。 - Marcos Sánchez
1
是的...这就是为什么我在电子邮件包中使用解码参数而不是quopri。它会处理我可能拥有的不同编码 :) - Nicola Pezzotti
1
如果你能够分享你的代码那就太好了!:) - Manu CJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接