【问题标题】:base64 encoding not taking mime messagebase64 编码不接受 mime 消息
【发布时间】:2019-02-05 02:19:53
【问题描述】:

我正在尝试使用 python 发送 oauth gmail,但无法创建与 Google API 一致的 MimeMessage。创建示例消息后,我使用 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

【问题讨论】:

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


【解决方案1】:

对于以后遇到此问题的任何人,这似乎都有效

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

【讨论】:

    【解决方案2】:

    根据答案here,您可以使用:

    '字符串'.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 之类的错误。

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 2019-04-27
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2019-04-26
      • 2016-12-31
      • 2018-01-23
      相关资源
      最近更新 更多