我正在尝试使用python发送oauth gmail,但无法创建与Google API一致的MimeMessages。创建示例消息后,我使用base64将其编码为字符串。但是,我想出了错误:TypeError: a bytes-like object is required, not 'str'
堆栈顶部的行:
return {'raw': base64.urlsafe_b64encode(message_str)}
我尝试使用不同版本的编码(encoders.encode_base64(message)
,message.as_string().encode("utf-8")
等),并尝试将message.as_string()转换为字节(如错误消息所示),但被满足了并收到了来自Google的不同错误消息,说编码不符合要求,即“符合RFC 2822且编码为base64url字符串的MIME电子邮件消息。”
我的整个功能如下。
def create_message(sender, to, subject, message_text):
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
message_str = message.as_string()
return {'raw': base64.urlsafe_b64encode(message_str)}
我不知道为什么这不起作用。它是从教程复制粘贴的。我正在运行python 3.7.2
答案 0 :(得分:1)
对于以后遇到此问题的任何人,这似乎都有效
raw = base64.urlsafe_b64encode(message.as_bytes())
raw = raw.decode()
return {'raw': raw}
答案 1 :(得分:0)
根据答案here,您可以使用:
'string'.as_bytes()
不确定为什么gmail api docs的代码中存在此错误,但这就是我如何使其工作的方式。 (可能是指python 2)
要针对您的特定问题回答此问题,我这样做:
def create_message(sender, to, subject, message_text):
message = MIMEText(message_text)
message['To'] = to
message['From'] = sender
message['Subject'] = subject
message_bytes = message.as_bytes()
return {'raw': base64.urlsafe_b64encode(message_bytes).decode('ascii')}
我在这里使用
decode('ascii')
是因为这样做的结果将是一个json字符串,并且字节无法序列化。否则,您可能会遇到诸如TypeError: Object of type bytes is not JSON serializable
之类的错误。