我正在将Gmail API合并到我正在制作的程序中,我收到的错误是我无法解决/我无法在线找到答案.相关代码如下,以及错误:
from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
import base64
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import mimetypes
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):
message = (service.users().messages().send(userId=user_id, body=message).execute())
print('Message Id: %s' % message['id'])
return message
def send_email(orders):
SCOPES = 'https://mail.google.com/'
store = file.Storage('gmail.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
service = discovery.build('gmail','v1',http=creds.authorize(Http()))
message_text = orders[0]
created_message = create_message('from','to','subject', message_text)
send_message(service, 'from', created_message)
send_email(['TEST'])
Traceback (most recent call last):
File "test_email.py", line 50, in <module>
schoolPing(['TEST'])
File "test_email.py", line 47, in schoolPing
created_message = create_message('from','to','subject', message_text)
File "test_email.py", line 27, in create_message
return {'raw': base64.urlsafe_b64encode(message.as_string())}
File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 119, in urlsafe_b64encode
return b64encode(s).translate(_urlsafe_encode_translation)
File "/Users/Andre/anaconda/lib/python3.5/base64.py", line 59, in b64encode
encoded = binascii.b2a_base64(s)[:-1]
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)
Jam*_*per 34
找到解决方案,替换此行:
return {'raw': base64.urlsafe_b64encode(message.as_string())}
Run Code Online (Sandbox Code Playgroud)
有:
return {'raw': base64.urlsafe_b64encode(message.as_string().encode()).decode()}
Run Code Online (Sandbox Code Playgroud)
注意添加.encode()和.decode()方法调用.
首先,str对象被编码为bytes对象 - base64.urlsafe_b64encode在Python 3中需要它(与Python 2中的str对象相比).
然后,必须将base64编码的字节对象解码回str.这是必需的,因为googleapiclient库将尝试稍后在代码中对其进行json序列化,这对于字节对象是不可能的.
| 归档时间: |
|
| 查看次数: |
2871 次 |
| 最近记录: |