2016-01-15 5 views
0

Я пытаюсь использовать gmail api для применения фильтров к моему почтовому ящику. Я могу видеть только поддержку создания ярлыков. Можете ли вы помочь мне понять, как я могу создавать фильтры и применять ярлыки для писем, которые соответствуют фильтрам?Применение фильтров с использованием gmail api

Спасибо за помощь

ответ

1

Вы не можете применять фильтры к Входящему с API Gmail. API Gmail предоставляет RESTful доступ к черновикам, истории, ярлыкам, сообщениям, вложениям, потокам и возможности просмотра почтового ящика для получения push-уведомлений.

create filters with the admin sdk.

+0

Я пробовал это, но похоже, что ClientLogin устарел https://developers.google.com/identity/protocols/AuthForInstalledApps – Noobdev

+0

@Noobdev Я полагаю, что ClientLogin устарел, но можно создать фильтры через [Gmail API] (https://developers.google.com/gmail/api/v1/reference/users/settings/filters/create). Не существует ли способа «применять»/«запускать» фильтры через API Gmail? Я хочу добиться того же, что и в диалоговом окне «Создание фильтра», так же как и «Использовать фильтр для сопоставления». –

+0

@Noobdev Я думаю, что можно было бы сделать тот же поиск, определенный в фильтре, через графический интерфейс и [добавить правильные метки] (https://developers.google.com/gmail/api/guides/labels#applying_labels_to_messages_and_threads) программно тоже. –

0

Критерий фильтра описывает поисковый запрос. Можно получить все потоки, соответствующие этому поисковому запросу, и выполнить эффект фильтра.

У меня есть простой пример здесь. Мы используем простой фильтр, который добавляет метку, если объект соответствует строке. Этот пример можно расширить, чтобы охватить произвольные фильтры.

Как упоминалось в @Tholle, я также не смог найти простой «запустить этот фильтр на существующие сообщения» api call.

def createFilter(service,userId,o): 
    r = service.users().settings().filters().create(
     userId=userId,body=o).execute() 
    print("Created filter {}".format(r.get("id"))) 
    return r 

def getMatchingThreads(service,userId,labelIds,query): 
    """Get all threads from gmail that match the query""" 

    response = service.users().threads().list(userId=userId,labelIds=labelIds, 
     q=query).execute() 
    threads = [] 
    if 'threads' in response: 
     threads.extend(response['threads']) 

    # Do the response while there is a next page to receive. 
    while 'nextPageToken' in response: 
     pageToken = response['nextPageToken'] 
     response = service.users().threads().list(
      userId=userId, 
      labelIds=labelIds, 
      q=query, 
      pageToken=pageToken).execute() 
     threads.extend(response['threads']) 

    return threads 

def buildSearchQuery(criteria): 
    """Input is the criteria in a filter object. Iterate over it and return a 
    gmail query string that can be used for thread search""" 

    queryList = [] 
    positiveStringKeys = ["from","to","subject"] 
    for k in positiveStringKeys: 
     v = criteria.get(k) 
     if v is not None: 
      queryList.append("("+k+":"+v+")") 

    v = criteria.get("query") 
    if v is not None: 
     queryList.append("("+v+")") 

    # TODO: This can be extended to include other queries. Negated queries, 
    # non-string queries 

    return " AND ".join(queryList) 

def applyFilterToMatchingThreads(service,userId,filterObject): 
    """After creating the filter we want to apply it to all matching threads 
    This function searches all threads with the criteria and appends the same 
    label of the filter""" 

    query = buildSearchQuery(filterObject["criteria"]) 
    threads = getMatchingThreads(service,userId,[],query) 

    addLabels = filterObject["action"]["addLabelIds"] 
    print("Adding labels {} to {} threads".format(addLabels,len(threads))) 

    for t in threads: 
     body = { 
      "addLabelIds": addLabels, 
      "removeLabelIds": [] 
     } 
     service.users().threads().modify(userId=userId,id=t["id"], 
      body=body).execute() 


# Create your service like in here 
# https://developers.google.com/gmail/api/quickstart/python 

desiredFilters = [ 
    { 
     "criteria": { 
      "subject": "[JIRA]", 
     }, 
     "action": { 
      "addLabelIds": [labelNameToId["jira"]], 
     } 
    }, 
] 
for df in desiredFilters: 
    createFilter(service,"me",df) 
    applyFilterToMatchingThreads(service,"me",df) 

Это не полный рабочий пример кнопки. Вам необходимо создать свой собственный объект службы и сначала выполнить аутентификацию OAUTH2.