【问题标题】:GMail API Python and Encoding/DecodingGMail API Python 和编码/解码
【发布时间】:2015-12-05 13:50:44
【问题描述】:

我正在尝试使用 Google 使用 Python 3.4 提供的 API 阅读我的 GMail 邮件。

我正在使用谷歌在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 必须是 str 或 None,而不是 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')

如果我不添加“忽略”参数,我会收到以下错误:

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,我不知道如何解决它。 有什么想法吗?

【问题讨论】:

    标签: python utf-8 python-3.4 gmail-api


    【解决方案1】:

    邮件内容似乎在报价打印编码中。

    你可以使用quopri模块来处理https://docs.python.org/2/library/quopri.html

    【讨论】:

      【解决方案2】:

      正如 Arkanus 所说,问题与可引用打印的编码有关。

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

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

      【讨论】:

      • 处理邮件时的一般良好做法是检查Content-TypeContent-Transfer-Encoding 标头;我不知道 GMail API 如何格式化它的输出,但您也可能会遇到带有其他字符集和编码的邮件
      • yap... 这就是为什么我在电子邮件包中使用 decode 参数而不是 quopri。它将处理我可能拥有的不同编码:)
      • 如果你真的分享你的代码会很好! :)
      猜你喜欢
      • 2018-07-25
      • 2017-07-27
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2018-10-18
      • 2023-03-17
      • 2017-12-25
      • 2019-01-27
      相关资源
      最近更新 更多