Gmail에서 라벨 관리

24475 단어 pythonapigoogleemail
Gmail 및 Line Bot을 사용하여 알림 시스템을 구현하는 방법에 대한 기사 시리즈의 2부

다시 안녕. 이전 게시물에서 언급 한 가이드를 따랐다면. 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는 어디에서 왔습니까? 그것은 우리 시리즈의 다음 포스트에 대한 이야기입니다.

좋은 웹페이지 즐겨찾기