Python Google OAuth2给出“ TypeError:需要类似字节的对象,而不是'str'”

时间:2019-08-23 20:59:48

标签: python flask gmail

使用OAuth2发送电子邮件的代码Google provides在Python 2中,并且我正在尝试使用Python 3发送电子邮件。消息正文导致错误。

发送电子邮件的基本过程是:
为消息正文创建一个f字符串。 调用执行create message的{​​{1}}
然后,此函数调用message = MIMEText(message_text)

...生成消息 return {'raw': base64.urlsafe_b64encode(message.as_string())}

为什么?我该如何避免抛出此错误?

下面是代码(主要来自上面链接的Google Gmail示例):

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

这是跟踪:

def create_message(sender, to, subject, message_text):
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.urlsafe_b64encode(message.as_string())}

def send_reset_email(user):
    token = user.get_reset_token()
    msg = create_message(sender='me@gmail.com', to=user.email,
             subject = 'Password Reset Request',
    message_text = f'''To reset your password visit the following link:
    {url_for('reset_token', token=token, _external=True)}
    ''')
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)
    send_message()

2 个答案:

答案 0 :(得分:1)

尝试类似这样的方法,我认为字符串的处理方式有所不同。 其中包含有关从Py2到Py3的潜在字符串问题的一些信息,相似之处可以帮助您解决一些问题:http://python3porting.com/problems.html

message_body = "some message"
# now message_text needs this encoded string
message_text = message_body.encode('utf-8')

答案 1 :(得分:1)

从您的代码中我可以看到的是

<div class="header">
    <div class="header-left">
      <button>btn</button>
      <span>header</span>
    </div>
    <button>btn</button>
  </div>
<div class="container">
  <div class="item">
    <p>content</p>
  </div>
</div>

应更改为

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

使用Google代码很好,但有时无法正常使用。

如果您要发送带有附件的电子邮件,则需要将最后一行更改为仅对您有帮助的额外信息。

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