代码示例中的Gmail API错误 - 需要类似字节的对象,而不是'str'

A. *_*iro 19 python api gmail

我正在将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序列化,这对于字节对象是不可能的.

  • 太感谢了。Gmail API 文档应根据您的答案进行更新。 (7认同)
  • 如果您要添加二进制附件并遵循代码示例: - 您需要使用 `as_bytes` 而不是 `as_string`。不需要调用`encode`,但你仍然需要调用`decode`。- 您需要在调用 `set_payload` 后添加对 `encoders.encode_base64` 的调用 (3认同)