Gmail에서 라벨 관리
다시 안녕. 이전 게시물에서 언급 한 가이드를 따랐다면. A Beginner’s Guide to the Gmail API and Its Documentation . 다음 섹션은 다소 친숙할 것입니다.
이 섹션에서는 Gmail 내에서 사용되는 레이블에 액세스하고 새 레이블을 만들고 새 레이블의 ID도 가져옵니다. google API는 레이블 이름을 사용하지 않기 때문에 id는 중요합니다. 사용자 인터페이스에 표시되는 이름일 뿐입니다.
이 시점에서 코드의 일부를 구성할 것입니다.
이것은 새로운 시작 코드가 될 것입니다.
import pickle, os.path, sys
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.modify',
'https://www.googleapis.com/auth/gmail.labels']
def get_service():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
# Another option to ignore google cache logging issue
# service = build('gmail', 'v1', credentials=creds, cache_discovery=False)
service = build('gmail', 'v1', credentials=creds)
return service
def main():
service = get_service()
if __name__ == '__main__':
main()
API에 연결하는 코드를 API에 액세스하는 데 사용할 수 있는 개체를 반환하는 자체 함수 호출 get_service로 옮겼습니다.
예리한 독자는 내가 SCOPES를 업데이트했음을 알아차렸습니다. 나는 이 시리즈의 나중 포스트에서 이메일을 수정할 것이고 우리는 또한 그것을 읽고 수정할 수 있도록 레이블에 대한 액세스 권한이 필요합니다.
다음 함수 세트가 바로 위의 파일에 추가됩니다: def main():
먼저 Gmail 계정에 있는 모든 레이블 목록을 얻을 수 있기를 원할 수 있습니다. 이 코드를 사용하여 수행할 수 있습니다.
def get_labels(service):
list_of_labels = service.users().labels().list(userId='me').execute()
return list_of_labels.get('labels')
get_labels는 json 객체 목록을 반환합니다. 파이썬의 사전 일뿐입니다.
다음으로 Gmail에서 사용할 새 레이블을 만들 수 있습니다. 이것은 다음 코드로 수행할 수 있습니다.
def define_label(name, mlv="show", llv="labelShow"):
label = dict()
label["messageListVisibility"] = mlv
label["labelListVisibility"] = llv
label["name"] = name
return label
이것은 Gmail에서 유효한 라벨을 생성하는 가장 간단한 json 형식입니다.
이 함수를 호출하면:
define_label("test")
다음 json 문자열을 얻습니다.
{
'messageListVisibility': 'show',
'labelListVisibility': 'labelShow',
'name': 'test'
}
이 개체를 만든 후 실제로 Gmail에 추가하려고 합니다. 다음 코드를 사용하여 그렇게 할 수 있습니다.
def add_label_to_gmail(service, label):
try:
created_label = service.users().labels().create(userId='me',
body=label).execute()
return created_label
except Exception as e:
logger.error(e)
add_label_to_gmail()이 하는 일은 Gmail 내에 새 레이블을 만들기 위한 정보가 포함된 json 본문으로 API를 호출하는 것입니다. 문제가 있는 경우, 예를 들어 이름을 가진 레이블이 이미 존재하는 경우 새 레이블을 추가하려고 시도합니다. 우리는 예외를 얻을 것입니다.
모든 것이 잘되면 우리는 우리가 만든 원래 json을 포함하는 새로운 json을 얻을 것이지만 이제 레이블의 id도 포함할 것입니다.
{
'id': 'Label_30',
'name': 'test',
'messageListVisibility': 'show',
'labelListVisibility': 'labelShow'
}
이제 다음 함수를 사용하여 새 ID를 얻을 수 있습니다.
def get_new_label_id(new_label):
return new_label.get('id')
이것은 단순히 레이블의 ID를 문자열로 반환합니다.
실제로 이것은 다음과 같은 호출 집합을 만드는 것을 의미합니다.
new_label = define_label("test")
new_label = add_label_to_gmail(service, new_label)
new_id = get_new_label_id(new_label)
지금까지 완성된 코드는 다음과 같아야 합니다.
import pickle, os.path, sys
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.modify',
'https://www.googleapis.com/auth/gmail.labels']
def get_service():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
# Another option to ignore google cache logging issue
# service = build('gmail', 'v1', credentials=creds, cache_discovery=False)
service = build('gmail', 'v1', credentials=creds)
return service
def get_labels(service):
list_of_labels = service.users().labels().list(userId='me').execute()
return list_of_labels.get('labels')
def define_label(name, mlv="show", llv="labelShow"):
label = dict()
label["messageListVisibility"] = mlv
label["labelListVisibility"] = llv
label["name"] = name
return label
def add_label_to_gmail(service, label):
try:
created_label = service.users().labels().create(userId='me',
body=label).execute()
return created_label
except Exception as e:
logger.error(e)
def get_new_label_id(new_label):
return new_label.get('id')
def main():
service = get_service()
new_label = define_label("test")
added_label = add_label_to_gmail(service, new_label)
print(added_label)
new_id = get_new_label_id(added_label)
print(f"Store this id: {new_id}."
f"You will need it again later")
if __name__ == '__main__':
main()
그러나 이 새 ID가 생성되어 Gmail에 추가되면 왜 또는 어떻게 사용합니까?
첫 번째 기사에서 언급했듯이. 일부 이메일을 기반으로 쿼리하고 알림을 보내는 시스템을 만들고 있습니다. 하루 중 특정 시간(예: 5분에 한 번)에 Gmail을 꽤 자주 쿼리해야 합니다. Gmail의 검색 옵션을 사용하면 검색 조건을 newer_than:1day 이상의 이메일로 제한할 수 있습니다. 즉, 동일한 이메일이 여러 알림을 반복적으로 트리거하는 것을 볼 수 있습니다.
수정? 메시지가 처리될 때 레이블을 추가한 다음 검색 문자열에 -label:labelname을 사용하십시오. 이메일이 처리되면 의미합니다. 두 번째 처리되지 않습니다.
메시지에 라벨을 어떻게 추가합니까?
def add_label_to_message(service, msg_id, label_id):
try:
msg = service.users().messages().modify(userId='me',
id=msg_id,
body={'removeLabelIds': [],
'addLabelIds': [label_id]}
).execute()
except Exception as e:
# Do something here. print or log
이것은 새 레이블을 만든 후 얻은 서비스, msg_id 및 label_id를 사용합니다.
msg_id는 어디에서 왔습니까? 그것은 우리 시리즈의 다음 포스트에 대한 이야기입니다.
Reference
이 문제에 관하여(Gmail에서 라벨 관리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/basman/managing-your-labels-in-gmail-4ln텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)