2016-03-02 66 views
0

我想從昨天開始讀取未讀郵件。所以我不得不在message.list函數中實現多個查詢,這給我一個無效語法的錯誤。我該怎麼做?有人能幫我嗎?無論如何,internalDate會幫助我嗎?來自多個查詢的gmail api提示消息的錯誤

from __future__ import print_function 
    import httplib2 
    import os 
    from email.utils import parsedate_tz,mktime_tz,formatdate 
    from requests.adapters import HTTPAdapter 
    import datetime 
    from datetime import date,timedelta 
    import time 
    from apiclient import discovery 
    import oauth2client 
    from oauth2client import client 
    from oauth2client import tools 
    import json 
    try: 
     import argparse 
     flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() 
    except ImportError: 
     flags = None 

    SCOPES = 'https://www.googleapis.com/auth/gmail.readonly' 
    CLIENT_SECRET_FILE = 'client_server.json' 
    APPLICATION_NAME = 'Gmail API Python Quickstart' 
    def get_credentials(): 
     """Gets valid user credentials from storage. 

     If nothing has been stored, or if the stored credentials are invalid, 
     the OAuth2 flow is completed to obtain the new credentials. 

     Returns: 
      Credentials, the obtained credential. 
     """ 
     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-python-quickstart.json') 

     store = oauth2client.file.Storage(credential_path) 
     credentials = store.get() 
     if 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) 
      print('Storing credentials to ' + credential_path) 
     return credentials 

    def main(): 

     da=date.fromordinal(730920) 
     credentials = get_credentials() 
     http = credentials.authorize(httplib2.Http()) 
     service = discovery.build('gmail', 'v1', http=http) 
     today=date.today() 
     print (today) 
     yesterday=today-timedelta(1) 
     print (yesterday) 

     response = service.users().messages().list(userId='me',q='{in:inbox is:unread} AND {after: {0}.format(yesterday.strftime('%Y/%m/%d'))}').execute() 

     messages=[] 
     store=[] 
     message1=[] 
     test2=[] 
     da=[] 
     if 'messages' in response: 
     messages.extend(response['messages']) 
     fo = open("foo.txt", "wb") 


     for i in range(len(messages)): 

     store=messages[i]['id'] 
     message = service.users().messages().get(userId='me',id=store,format='metadata',metadataHeaders=['from','date']).execute() 
     fo.write(store+" "); 
     #print(message['payload']['headers'][0]) 
     fo.write(message['snippet'].encode('utf-8')+" ") 
     if message['payload']['headers'][0]['name'].lower()=="from": 
      From=message['payload']['headers'][0]['value'] 
      fo.write(From+" "); 
     elif message['payload']['headers'][0]['name'].lower()=="date": 
      da=message['payload']['headers'][0]['value'] 

      fo.write(da+"\n"); 

     for line in open("foo.txt"): 
      print(line) 

      # Open a file 
    # Close opend file 
     fo.close() 



    if __name__ == '__main__': 
     main() 

回答

1

用途:

q='in:inbox is:unread newer_than:3d' 

的查詢。 Gmail查詢沒有時區的概念,因此如果您嘗試獲得一天的電子郵件,則最終會出現一些重疊。只需使用本地過濾即可縮小範圍。有關更多幫助,請參閱advanced Gmail search。 API和Gmail用戶界面使用相同的查詢語法,並應顯示相同的結果,以便您可以在用戶界面中進行測試。