My python gmail api automation isn't retrieving all emails that it found

Viewed 70

I'm trying to automate a task to read my emails, based on criteria, download the attachments found and after upload to a google drive folder.

This is a part of my code:

def search_email(service, query_string, label_ids=[]):
    try:
        message_list_response = (
            service.users()
            .messages()
            .list(userId="me", labelIds=label_ids, q=query_string)
            .execute()
        )

        message_items = message_list_response.get("messages")
        nextPageToken = message_list_response.get("nextPageToken")

        while nextPageToken:
            message_list_response = (
                service.users()
                .messages()
                .list(
                    userId="me",
                    labelIDs=label_ids,
                    q=query_string,
                    pageToken=nextPageToken,
                )
                .execute()
            )

            message_items.extend(message_list_response.get("messages"))
            nextPageToken = message_list_response.get("nextPageToken")
        return message_items

    except Exception as e:
        return None


def get_message_detail(service, message_id, format="metadata", metadata_headers=[]):
    try:
        message_detail = (
            service.users()
            .messages()
            .get(
                userId="me",
                id=message_id,
                format=format,
                metadataHeaders=metadata_headers,
            )
            .execute()
        )
        return message_detail

    except Exception as e:
        print(e)
        return None


def create_folder_in_drive(service, folder_name, parent_folder=[]):
    file_metadata = {
        "name": folder_name,
        "parents": parent_folder,
        "mimeType": "application/vnd.google-apps.folder",
    }

    file = service.files().create(body=file_metadata, fields="id").execute()
    return file


"""
Step 1: Create Google Service instances
"""
gmail_service = construct_service("gmail")

time.sleep(2)

drive_service = construct_service("drive")

"""
Step 2: Search emails (with attachments)
"""
query_string = "has:attachment subject:Rodobens"
email_messages = search_email(gmail_service, query_string, ["INBOX"])

"""
Step 3: Download Emails and Create Drive Folder_name
"""

for email_message in email_messages:
    print("email_message:", email_message)
    messageId = email_message["threadId"]
    messageDetail = get_message_detail(
        gmail_service, email_message["id"], format="full", metadata_headers=["parts"]
    )
    messageDetailPayload = messageDetail.get("payload")


for item in messageDetailPayload["headers"]:
    if item["name"] == "Subject":
        if item["value"]:
            messageSubject = "{0} ({1})".format(item["value"], messageId)
        else:
            messageSubject = "(No Subject) ({0})".format(messageId)

When I run the entire code, it creates a folder in google drive, but just returns only one email, in this case, the oldest one.

Debugging the code, I reach 3 emails.

You can see below that there are the 3 emails that I want to grab, and the messageSubject returns just the oldest email.

email_message: {'id': '17c80cb8116afd06', 'threadId': '17c80cb31d258cfb'}
email_message: {'id': '17c7a84897a9742b', 'threadId': '17c7a83c87fd98bd'}
email_message: {'id': '17c6bc47dff5a1f4', 'threadId': '17c6bc4111f4f8bc'}
messageSubject: Relatório - Vendas Consórcio Rodobens – Franq (17c6bc4111f4f8bc)

So it recognizes 3 emails, but returns only one.

Any idea what maybe is wrong here?

0 Answers
Related