2017-04-11 35 views
5

我正在將Gmail API合併到我正在製作的程序中,並且出現一個我沒有的錯誤能夠解決/我無法找到在線答案。相關的代碼是下面,以及該錯誤:來自代碼示例的Gmail API錯誤 - 需要類似字節的對象,而不是'str'

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' 
+0

我得到相同的錯誤。似乎是一個python 3問題。 – fatman13

回答

4

實測值的溶液中,代替這一行:

return {'raw': base64.urlsafe_b64encode(message.as_string())} 

與:

return {'raw': base64.urlsafe_b64encode(message.as_string().encode()).decode()} 

通知加入.encode()。解碼()方法調用。

首先,STR對象進行編碼以字節對象 - base64.urlsafe_b64encode需要它在Python 3(相比STR對象在Python 2)。

然後,base64編碼的字節對象必須解碼回str。這是需要的,因爲googleapiclient庫將嘗試json序列化它稍後在代碼中,這是不可能的字節對象。

相關問題