Having issue with downloading files with same name from outlook using Python. Only one file is showing on folder

from datetime import date
import os
import email

import win32com.client
import pathlib
import glob
import re
from pathlib import Path

path = os.path.expanduser(file_location + "/" +date_file)
 
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)  #from inbox
inbox = inbox.Folders['folder 1'] #Folder inside Inbox Folder

today = datetime.date.today()        #from todays date
received_dt = date.today() - timedelta(days=1)

messages = inbox.Items          

def saveattachments():                                                  # subject= subject line t0 be inserted here. 
    for message in messages:                   
        if message.Unread:# and message.Senton.date() == today: 
            for attachment in message.Attachments:
                print(attachment.FileName)                                     # shows the file name to be downloaded
                attachment.SaveAsFile(os.path.join(path, str(attachment)))     #saves it the desired location
                if message.Unread:
                    message.Unread = False                                         #returns the email to read status
                
                
saveattachments()

I want to download all the files from unread emails. But files with same name gets replaced somehow only one file name is showing.

Example-

Files from outlook filename which gets saved on desk folder
a_file a_file
b_file b_file
c_file c_file
a_file d_file
b_file
b_file
a_file
b_file
c_file
d_file

Answer

This is very much expected behavior. There can be only one file with a specific name in a specific folder. You will need to implement some logic to see if the file already exists, and rename it.

See below for a simple example:

import os


def autorename(filename):
    """recursive function to add " (copy)" to a filename if it already exists.
    """
    if os.path.isfile(filename):
        newfilename = f"{os.path.splitext(filename)[0]} (copy){os.path.splitext(filename)[1]}"
        return autorename(newfilename)
    else:
        return filename

For the os.path.splitext() part, see this answer.


EDIT

To add this to your code, you need to change this line:

attachment.SaveAsFile(os.path.join(path, str(attachment)))

to this:

attachment.SaveAsFile(autorename(os.path.join(path, str(attachment))))

so it generates a new filename if the file already exists