2017-04-11 9 views
0

Gmail API를 사용하여 Python으로 이메일을 보내고 있지만 Python 3.4에서 작동하지 않는 것 같습니다. 여기 Gmail Api for Python이 잘못된 요청을 반환합니다.

코드입니다 :

msg = MIMEText(html, 'html') 
SCOPES = ['https://www.googleapis.com/auth/gmail.send'] 
username = '[email protected]' 
CLIENT_SECRET_FILE = '/client_secret.json' 
credentials = ServiceAccountCredentials.from_json_keyfile_name(CLIENT_SECRET_FILE, SCOPES) 
try: 
    http_auth = credentials.authorize(Http()) 
    service = discovery.build('gmail', 'v1', http=http_auth) 
    gmailMsg = {'raw': base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('utf-8')} 
    message = (service.users().messages().send(userId = username, body = gmailMsg).execute()) 

오류 :

기록을 위해
<HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Bad Request"> 

, 내 프로젝트를 위해 만든 자격 증명이 아닌 UI 플랫폼 (서버 - 서버)에 대한 서비스 계정 인 . gmailMsg 객체가 올바르게 인코딩되지 않았을 수도 있습니다. 그러나 Google Apis Explorer에서이 도구를 사용하면 다음과 같이 추측 할 수 있습니다. 파이썬에서 볼 수있는 유일한 차이점은 JSON은 작은 따옴표를 사용하는 반면 Google API 익스플로러에서는 큰 따옴표를 사용하지 못하게했습니다.

누구나 어떤 추천이 있습니까?

P/s의 : 나는 인코딩 옵션 다음 시도했다 :

base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('utf-8') 
base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('ascii') 
base64.urlsafe_b64encode(msg.as_string().encode('ascii')).decode('ascii') 
base64.urlsafe_b64encode(msg.as_bytes()).decode('utf-8') 
base64.urlsafe_b64encode(msg.as_bytes()).decode('ascii') 
base64.urlsafe_b64encode(msg.as_bytes()).decode() 

편집 : 흥미롭게도, 내가 몸을 필요로하지 않는 레이블 API를 사용하려고 노력했다. 하지만 같은 오류가 발생했습니다. 유일한 변경 사항은 다음과 같습니다.

답변

0

Gmail API를 사용하려면 서비스 계정 대신 OAuth 자격 증명을 사용해야합니다. 비 UI 시스템에서 Gmail API를 사용하려면 인증을 시작한 다음 oauth API에 의해 저장된 자격증 명을 복사 할 수 있습니다. 되는 다음 코드 :

home_dir = os.path.expanduser('~') 
credential_dir = os.path.join(home_dir, '.credentials') 
if not os.path.exists(credential_dir): 
    os.makedirs(credential_dir) 
credential_path = os.path.join(credential_dir, 
           'gmail-api.json') 

store = Storage(credential_path) 
credentials = store.get() 
f not credentials or credentials.invalid: 
    flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
    flow.user_agent = APPLICATION_NAME 
    if flags: 
     credentials = tools.run_flow(flow, store, flags) 
    else: # Needed only for compatibility with Python 2.6 
     credentials = tools.run(flow, store) 

는 그런 다음 Gmail에서 API 광고

을 소비하는 비 UI 시스템에 배포 할 Gmail은-api.json 파일을 사용할 수 있습니다