python - 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)
解决方案
尝试这样的事情,我认为字符串的处理方式不同。这有一些关于从 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')
推荐阅读
- c - 如何使用 pthreads 从 C 中的另一个线程安全地修改字符串?
- wpf - WPF:如何创建像“Telerik UI for WPF”这样的 UI 库?
- python - 具有定义函数的等高线图,其中输入为向量
- macos - 如何在 swift 和 Hal 驱动程序编写的应用程序之间共享数据
- shell - ZSH:读取时从内部输出的标准输出丢失
- c# - c# adobe acrobat SDK:SDK退出后文件仍被锁定
- r - 在R中没有标题的数据框前面插入一列
- python - 我如何将 Django - Tenant 与 Django Haystack 集成
- elasticsearch - 如何使用自定义序列化程序序列化类型信息也用于使用 NEST 和 Elasticsearch 的子文档
- javascript - 在反应页面之间加载微调器