首页 > 解决方案 > 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帐户

谢谢!

标签: pythontypeerrorgmail-api

解决方案


推荐阅读