【问题标题】:How to mark messages as read using gmail api as i parse?解析时如何使用gmail api将消息标记为已读?
【发布时间】:2016-06-17 04:02:25
【问题描述】:

在 python 中,当我从 gmail api 解析消息时,如何将消息标记为“已读”? 另外,解析后如何将值保存到数据库中? 到目前为止,这是获取每条消息内容的代码。

from __future__ import print_function
import httplib2
import os
import re
import MySQLdb
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():

    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 newer_than:1d').execute()
    messages=[]
    store=[]
    message1=[]
    test2=[]
    da=[]
    if 'messages' in response:
     messages.extend(response['messages'])
    fo = open("fooa.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(message['snippet'].encode('utf-8')+"")
     From=message['payload']['headers'][0]['value']
     fo.write(From+"");
     da=message['payload']['headers'][1]['value']
     fo.write(da+"\n");
     for line in open("fooa.txt"):
      print(line)
    fo.close()
    a=open("fooa.txt","r")
    for wo in a:
     match=re.findall(r':[\w]+',wo)
     for word in match:
      print(word.replace(':',' '))
    db = MySQLdb.connect("localhost","testuser","mysql23","db1" )
    cursor = db.cursor()
   sql = """INSERT INTO customers((LeadName, CITY, SERVICE,CUSTOMER, MOBILE, EMAIL)
         VALUES (, , , , )"""
try:
   cursor.execute(sql)
   db.commit()
except:
   db.rollback()
    db.close()
if __name__ == '__main__':
    main()

需要帮助!

【问题讨论】:

    标签: python gmail-api


    【解决方案1】:

    您需要在单独的请求中modify 消息,并删除UNREAD-标签。

    POST https://www.googleapis.com/gmail/v1/users/me/messages/1533cb4d7dac1633/modify?access_token={ACCESS_TOKEN}
    
    {
     "removeLabelIds": [
      "UNREAD"
     ]
    }
    

    【讨论】:

    • 我收到权限不足错误...因为最初我已授予只读权限...我该怎么办?
    【解决方案2】:

    如果您尝试将邮件标记为已读,则必须执行以下操作:

    gmail_service
           .users()
           .messages()
           .modify(userId='me', id=message_id, body={'removeLabelIds': ['UNREAD']})
           .execute()
    

    【讨论】:

      【解决方案3】:

      您可以使用 Gmail API 做什么取决于您授予 OAuth 的范围。以下是您需要做的:

      1. SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'更改为:
      SCOPES = [
          'https://www.googleapis.com/auth/gmail.readonly',
          'https://www.googleapis.com/auth/gmail.modify'
      ]
      

      说明:由于将电子邮件标记为“未读”是对邮件的修改,因此您需要“gmail.modify”范围才能使用此 API 请求。要查看范围的完整列表,请参阅 Choose Auth Scopes

      1. 删除您的 token.pickle 文件并重新运行脚本。您需要执行此操作才能使用新范围重新授权 OAuth 应用,然后生成新的 token.pickle 文件。

      2. 以下是在 Python 中将电子邮件标记为已读的代码:

      service.users().messages().modify(userId='me', id=message['id'], body={
          'removeLabelIds': ['UNREAD']
      }).execute()
      

      【讨论】:

        猜你喜欢
        • 2014-10-26
        • 2019-03-14
        • 2018-01-05
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2016-07-30
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多