python - 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
不知道我应该怎么做才能解决这个问题?有什么建议么?谢谢。
解决方案
这就是我最终做的事情。我将 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())
推荐阅读
- python - 使用python用它的值替换首字母缩写词
- sql - SQL查询有效地选择不完美的重复项
- haskell - 为什么 (*3) `map` (+100) 在 Idris 中不起作用?
- javascript - javax.servlet.ServletException: javax.script.ScriptException: java.lang.RuntimeException: 方法代码太大!在
- visual-studio-2017 - Analysis Services 表格 1400 项目 - 不是有效的数据源 - ADLS 数据源
- yaml - 序列条目位桶管道的缩进错误
- reactjs - TypeError:this.props.recipes.map 不是函数
- java - 遍历一个数组并获得 10 java 的所有倍数
- objective-c - 通过 Metal 框架的 registryID 实例属性获取 GPU 信息
- python - 如何使用过滤的查询集处理通用 ListView 分页?