Python Google OAuth2 gives "TypeError: a bytes-like object is required, not 'str'"

Python Google OAuth2 gives "TypeError: a bytes-like object is required, not 'str'"

使用 OAuth2 发送电子邮件的代码 Google provides 在 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)

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

从你的代码中我能看到的是

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

应该改为

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

使用 google 代码很好,但有时它无法按预期工作。

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

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