base64编码不接收mime消息

时间:2019-02-05 02:19:54

标签: python python-3.x email gmail encode

我正在尝试使用python发送oauth gmail,但无法创建与G​​oogle 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

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之类的错误。