Exemplo n.º 1
0
def perform_action(creds, rules_json):
    """
    Performs action on the emails stored in the database.
    """
    service = build("gmail", "v1", credentials=creds)
    query_list = []

    for rule in rules_json["rules"]:
        query_list.append(filter_controller(rule))

    if rules_json["rulesRelation"].upper() == "ALL":
        mails = Query.intersect(*query_list).all()
    elif rules_json["rulesRelation"].upper() == "ANY":
        mails = Query.union(*query_list).all()

    add_labels, remove_labels = process_labels(rules_json["actions"])

    for mail in mails:
        response = (service.users().messages().modify(
            userId="me",
            id=mail.message_id,
            body={
                "addLabelIds": add_labels,
                "removeLabelIds": remove_labels
            },
        ).execute())
        mail.labels = response["labelIds"]
    log.debug(f"Actions performed on {len(mails)} matching emails")
Exemplo n.º 2
0
def process_emails(creds, rules_file):
    """
    Fetches emails from the database and performs
    actions, all based on set of rules in JSON format
    --------------------------------------------------

    arguments:
        - creds: oauth token object
        - rules_file: Json file path containing rules
    """
    service = build('gmail', 'v1', credentials=creds)
    with open(rules_file, 'r') as rf:
        rules = json.load(rf)

    session = Session()
    query_objects = []

    for rule in rules['rules']:
        if rule['field'].upper() == 'FROM':
            q = from_field_filter(session, rule)
            query_objects.append(q)
        elif rule['field'].upper() == 'SUBJECT':
            q = subject_field_filter(session, rule)
            query_objects.append(q)
        elif rule['field'].upper() == 'DATE':
            q = date_field_filter(session, rule)
            query_objects.append(q)

    if rules['globalPredicate'].upper() == 'ALL':
        messages = Query.intersect(*query_objects).all()
    elif rules['globalPredicate'].upper() == 'ANY':
        messages = Query.union(*query_objects).all()

    add_labels = []
    remove_labels = []

    for action in rules['actions']:
        if action['action'].upper() == 'MOVE':
            add_labels.append(action['value'].upper())
        elif (action['action'].upper() == 'MARK'
              and action['value'].upper() == 'UNREAD'):
            add_labels.append(action['value'].upper())
        elif (action['action'].upper() == 'MARK'
              and action['value'].upper() == 'READ'):
            remove_labels.append('UNREAD')

    for message in messages:
        result = service.users().messages().modify(userId='me',
                                                   id=message.message_id,
                                                   body={
                                                       'addLabelIds':
                                                       add_labels,
                                                       'removeLabelIds':
                                                       remove_labels
                                                   }).execute()
        message.labels = result['labelIds']
    session.commit()
    session.close()
    print(f'Actions performed on {len(messages)} matching messages')