首页 > 解决方案 > Google gmail API:base64 需要字节,但 URL 正文需要 str

问题描述

我正在学习这个Google Gmail API 教程(实际上我正在浏览它以发送电子邮件)。我的电子邮件正文必须编码为 MIMEText 和 base64,但 JSON 有效负载的“原始”属性的内容必须是字符串。这导致我陷入“困境”,出现 2 个错误。以下是教程后面的代码:

message = MIMEText(RecipData["EmailText"])

message['to'] = RecipData["Email"]

message['from'] = SENDER

message['subject'] = Subject

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

service.users().messages().send(userId=SENDER, body=EncodedMessage).execute()

我收到以下错误:

TypeError: a bytes-like object is required, not 'str'

现在如果我改变这一行:

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

至:

EncodedMessage = {'raw': base64.urlsafe_b64encode(message.as_bytes())}

然后我得到一个错误:

TypeError: Object of type bytes is not JSON serializable

不知道我应该怎么做才能解决这个问题?有什么建议么?谢谢。

标签: pythonjsongoogle-apibase64

解决方案


这就是我最终做的事情。我将 MIMEText 转换为一个字节,以便它可以在内部工作,base64.urlsafe_b64encode()然后我使用它str(),以便数据适合 JSON。但是,str()需要剥离的是b'...'被包裹在字符串中的那个。

message = base64.urlsafe_b64encode(bytes(message))

message = {'raw': str(message).strip('b').strip('\'')}
print(service.users().messages().send(userId="me", body=message).execute())  

推荐阅读