2017-04-11 12 views
5

मैं जीमेल एपीआई को एक प्रोग्राम में शामिल कर रहा हूं जो मैं कर रहा हूं, और मुझे एक त्रुटि मिल रही है कि मेरे पास नहीं है हल करने में सक्षम/यह कि मुझे ऑनलाइन जवाब नहीं मिला है। प्रासंगिक कोड के नीचे है, साथ ही त्रुटि:कोड नमूना से जीमेल एपीआई त्रुटि - एक बाइट्स जैसी ऑब्जेक्ट की आवश्यकता है, '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

मुझे एक ही त्रुटि मिल रही है। एक पायथन 3 मुद्दा लगता है। – fatman13

उत्तर

4

एक समाधान मिला, इस लाइन की जगह:

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

साथ:

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

सूचना .encode जोड़ा() और .decode() विधि कॉल। (str अजगर 2 में वस्तु की तुलना में) base64.urlsafe_b64encode अजगर 3 में यह आवश्यकता है -

पहले, str वस्तु बाइट्स वस्तु को एन्कोड किया गया है।

फिर, बेस 64 इनकोडिंग बाइट्स वस्तु str को वापस डीकोड किया जाना चाहिए। googleapiclient लाइब्रेरी json serialize बाद में कोड में और बाइट ऑब्जेक्ट्स के लिए संभव नहीं है।

संबंधित मुद्दे