python - TypeError:需要一个类似字节的对象,而不是使用 gmail API 时的“str”
问题描述
我正在关注 Gmail API 指南链接。我尝试替换as_string()
为,as_bytes()
但这也不起作用。问题是什么?
Traceback (most recent call last):
File "gmail.py", line 38, in <module>
message = create_message(sender, to, subject, message_text)
File "gmail.py", line 20, in create_message
return {'raw': base64.urlsafe_b64encode(message.as_string())}
File "/usr/lib/python3.6/base64.py", line 118, in urlsafe_b64encode
return b64encode(s).translate(_urlsafe_encode_translation)
File "/usr/lib/python3.6/base64.py", line 58, in b64encode
encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
这是我的代码,
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import time
from datetime import datetime, timedelta
import math
# Ability to create the e-mail
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import base64
import os
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_message(service, user_id, message):
try:
message = (service.users().messages().send(userId=user_id, body=message)
.execute())
print ('Message Id: %s' % message['id'])
return message
except errors.HttpError:
print ('An error occurred: %s' % error)
if __name__ == '__main__':
sender = '<Your email id>'
to = '<Your email id>'
subject = 'API test'
message_text = 'Hello World'
message = create_message(sender, to, subject, message_text)
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
send_message(service, sender, message)
print('success')
要重新创建它,您需要在此之后使用 gmail API 设置一个 gmail帐户
谢谢!
解决方案
推荐阅读
- c++ - 如何将编译器标志仅限于(我的)本地库?
- c - 如何确定 linux 控制消息中多个辅助消息的大小
- node.js - 云手表中的 AWS S3 Lambda 缩略图生成节点错误
- php - 查询在 phpmyadmin 中执行,但不在 PHP Wordpress 中
- ios - 如何使用 Swift 删除 coredata 中的特定记录?
- python - 将 csv 转换为用于 zipline 的面板 pandas
- php - 如何使用codigniter在mysql中插入多维数组
- typescript - 打字稿合并元组
- mqtt - 如何在 mosquitto MQTT 中处理具有相同 ID 的多个客户端?
- vue.js - Nuxt.js 中的简单嵌套动态路由