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?