Рубрики
Без рубрики

Управление вашими ярлыками в Gmail

Часть 2 В серии статей о внедрении системы уведомлений с использованием Gmail и Line Bot Привет… Помечено Google, Python, API, электронная почта.

Часть 2 В серии статей о внедрении системы уведомлений с использованием Gmail и Линия бота

Привет еще раз. Если вы следили за руководством, я указан в предыдущем посте. Руководство для начинающих к API Gmail и его документация Отказ Следующий раздел будет несколько знакомым.

В этом разделе мы дойдем к этикеткам, используемым в Gmail, создавая новую метку, а также получить новую метку ID Отказ Идентификатор имеет решающее значение, потому что API Google не использует имя метки. Это просто имя, отображаемое в пользовательском интерфейсе.

Я собираюсь структурировать некоторые из кода также в этот момент.

Это будет новый исходный код.

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 в свой собственный вызов функции get_service который возвращает объект, который мы можем использовать для доступа к API. Опрятный читатель, мой заметил, что я обновил области. Я буду модифицировать электронные письма в более позднем посте в серии, и нам также нужен доступ к меткам, чтобы иметь возможность их читать и изменять.

Следующий набор функций будет добавлен в файл чуть выше: 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. Которые просто словари в Python.

Далее мы можем захотеть создать новую метку для использования с Gmail. Это можно сделать со следующим кодом.

def define_label(name, mlv="show", llv="labelShow"):
    label = dict()
    label["messageListVisibility"] = mlv
    label["labelListVisibility"] = llv
    label["name"] = name
    return label

Это самая простая форма JSON, которая создаст действительный ярлык в Gmail. Если мы назовем эту функцию:

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 (), вызывает API с помощью тела JSON, содержащего информацию, чтобы создать новую метку в Gmail. Если есть проблема, например, пытаясь добавить новую метку, когда один с именем уже существует; Мы получим исключение. Если все идет хорошо, мы получим новый JSON, содержащий оригинал JSON, которые мы создали, Но Теперь он также будет содержать метку я бы

{
  '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? Как упоминалось в первой статье. Я работаю над созданием системы, которая запросит и отправляет уведомления на основе некоторых писем. Мне нужно честно запрашивать Gmail в течение определенных времен дня, скажем раз в 5 минут. Параметры поиска 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 и LABLE_ID Мы получили после создания новой этикетки.

Откуда приходит msg_id? Это история для следующего поста в нашей серии.

Оригинал: “https://dev.to/basman/managing-your-labels-in-gmail-4ln”