Критерий фильтра описывает поисковый запрос. Можно получить все потоки, соответствующие этому поисковому запросу, и выполнить эффект фильтра.
У меня есть простой пример здесь. Мы используем простой фильтр, который добавляет метку, если объект соответствует строке. Этот пример можно расширить, чтобы охватить произвольные фильтры.
Как упоминалось в @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.
Я пробовал это, но похоже, что ClientLogin устарел https://developers.google.com/identity/protocols/AuthForInstalledApps – Noobdev
@Noobdev Я полагаю, что ClientLogin устарел, но можно создать фильтры через [Gmail API] (https://developers.google.com/gmail/api/v1/reference/users/settings/filters/create). Не существует ли способа «применять»/«запускать» фильтры через API Gmail? Я хочу добиться того же, что и в диалоговом окне «Создание фильтра», так же как и «Использовать фильтр для сопоставления». –
@Noobdev Я думаю, что можно было бы сделать тот же поиск, определенный в фильтре, через графический интерфейс и [добавить правильные метки] (https://developers.google.com/gmail/api/guides/labels#applying_labels_to_messages_and_threads) программно тоже. –