代码示例中的 Gmail API 错误 - 需要类似字节的对象,而不是“str" [英] Gmail API Error from Code Sample - a bytes-like object is required, not 'str'

查看:19
本文介绍了代码示例中的 Gmail API 错误 - 需要类似字节的对象,而不是“str"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将 Gmail API 合并到我正在制作的程序中,但我收到了一个我无法解决的错误/我无法在网上找到答案.相关代码如下,以及错误:

I'm incorporating the Gmail API into a program that I'm making, and I'm getting an error that I haven't been able to resolve/that I haven't been able to find an answer to online. The relevant code is below, as well as the error:

from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
import base64
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import mimetypes
import os

def create_message(sender, to, subject, message_text):

    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject

    return {'raw': base64.urlsafe_b64encode(message.as_string())}

def send_message(service, user_id, message):

    message = (service.users().messages().send(userId=user_id, body=message).execute())
    print('Message Id: %s' % message['id'])
    return message

def send_email(orders):
    SCOPES = 'https://mail.google.com/'
    store = file.Storage('gmail.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = discovery.build('gmail','v1',http=creds.authorize(Http()))

    message_text = orders[0]

    created_message = create_message('from','to','subject', message_text)
    send_message(service, 'from', created_message)
send_email(['TEST'])


Traceback (most recent call last):
  File "test_email.py", line 50, in <module>
    schoolPing(['TEST'])
  File "test_email.py", line 47, in schoolPing
    created_message = create_message('from','to','subject', message_text)
  File "test_email.py", line 27, in create_message
    return {'raw': base64.urlsafe_b64encode(message.as_string())}
  File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 119, in urlsafe_b64encode
    return b64encode(s).translate(_urlsafe_encode_translation)
  File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 59, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: a bytes-like object is required, not 'str'

推荐答案

找到解决方案,替换这一行:

Found a solution, replace this line:

return {'raw': base64.urlsafe_b64encode(message.as_string())}

与:

return {'raw': base64.urlsafe_b64encode(message.as_string().encode()).decode()}

通知添加了 .encode().decode() 方法调用.

Notice added .encode() and .decode() method calls.

首先,str 对象被编码为 bytes 对象 - base64.urlsafe_b64encode 在 Python 3 中需要它(与 str Python 2 中的对象).

First, str object is encoded to bytes object - base64.urlsafe_b64encode requires it in Python 3 (compared to str object in Python 2).

然后,base64 编码的bytes 对象必须被解码回str.这是必需的,因为 googleapiclient 库将尝试在稍后的代码中json 序列化它,而这对于 bytes 对象是不可能的.

Then, the base64 encoded bytes object must be decoded back to str. This is needed as googleapiclient library will attempt to json serialize it later in code and that is not possible for bytes objects.

这篇关于代码示例中的 Gmail API 错误 - 需要类似字节的对象,而不是“str"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆