首页 > 解决方案 > Python Google OAuth2 给出“TypeError:需要一个类似字节的对象,而不是'str'”

问题描述

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

发送电子邮件的基本过程是:
为邮件正文创建一个 f 字符串。调用create message执行message = MIMEText(message_text)
此函数然后调用return {'raw': base64.urlsafe_b64encode(message.as_string())}

...生成消息 TypeError: a bytes-like object is required, not 'str'

为什么?我怎样才能得到这个不抛出这个错误?.

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

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()

这是跟踪:

  File "C:\home\app\routes.py", line 187, in send_reset_email)
  File "C:\home\app\routes.py", line 169, in create_message
     return {'raw': base64.urlsafe_b64encode(message.as_string())}
  File "C:\home\b\base64.py", line 118, in urlsafe_b64encode
     return b64encode(s).translate(_urlsafe_encode_translation)
  File "C:\home\b\base64.py", line 58, in b64encode
    hencoded = binascii.b2a_base64(s, newline=False)

标签: pythonflaskgmail

解决方案


尝试这样的事情,我认为字符串的处理方式不同。这有一些关于从 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')

推荐阅读