win32com.client pour envoyer différentes pièces jointes au lieu d'un chemin de fichier fixe
Je suis capable d'envoyer des e-mails à différents destinataires sur Outlook avec le script ci-dessous pour une seule pièce jointe, mais si j'essaie d'envoyer différentes pièces jointes à chaque utilisateur en utilisant la boucle for, cela échoue.
Actuellement, le script utilise attachment = r'C:\Users\roy\Royfile.csv'
. Mais je veux attachment = file
, pour que la pièce jointe change dans chaque boucle for pour différents utilisateurs. Cette partie ne fonctionne pas.
Différents fichiers pour différents utilisateurs, exemple Royfile.csv
ci-dessous. Mais il existe 50 autres fichiers de ce type.
Folder FolderOwner EmailAddress AttachmentPath
C:\folder1\ Roy [email protected] Royfile.csv
D:\folder2\ Roy [email protected] Royfile.csv
2ème fichier dans le même dossier Jackfile.csv
:
Folder FolderOwner EmailAddress AttachmentPath
C:\folder3\ Jack [email protected] Jackfile.csv
D:\folder4\ Jack [email protected] Jackfile.csv
3ème fichier par exemple Mandyfile.csv
. Et de la même manière, un total de 50 fichiers pour 50 utilisateurs dans le même dossier.
Folder FolderOwner EmailAddress AttachmentPath
C:\folder5\ Mandy [email protected] Mandyfile.csv
D:\folder6\ Mandy [email protected] Mandyfile.csv
Script Python
import glob, as
import win32com.client as win32
import pandas as pd
for file in glob.glob("*file.csv"):
print(file)
email_list = pd.read_csv(file)
names = email_list['FolderOwner']
emails = email_list['EmailAddress']
attachments = email_list['AttachmentPath']
for i in range(len(emails)):
print(file)
name = names[i]
email = emails[i]
attachment = r'{}.csv'.format(attachments)
with open(attachment, 'r') as my_attachment:
myfile = my_attachment.read()
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = email
mail.Subject = 'Message subject'
mail.Body = 'Hello ' + name
mail.Attachments.Add(attachment)
mail.Send()
break
Sortie actuelle du script si je supprime la pièce jointe:
Royfile.csv
Royfile.csv
Jackfile.csv
Jackfile.csv
Mandyfile.csv
Mandyfile.csv
...
..
.
Lutter maintenant avec ce qui doit être pour l'attachement = ???. Pour que chaque fichier soit envoyé à 50 utilisateurs.
Réponses
Je ne sais pas comment vos fichiers ont nommé comment ils sont distribués dans différents dossiers, essayez de mettre tous leurs noms avec les chemins dans une feuille Excel dans une colonne et de les parcourir comme vous le faites pour les noms et les courriers
attachment = r'{}.csv'.format(filepaths from excel sheet)
with open(attachment, 'r') as my_attachment:
myfile = my_attachment.read()
J'ai enfin trouvé la réponse à ma question, ci-dessous le code complet. L'erreur arrivait, car PATH manquait. win32com lib nécessite le chemin complet même si le script s'exécute dans le même dossier que les pièces jointes. fonctionne parfaitement maintenant. :)
import glob, as
import win32com.client as win32
import pandas as pd
for file in glob.glob("*file.csv"):
print(file)
email_list = pd.read_csv(file)
names = email_list['FolderOwner']
emails = email_list['EmailAddress']
attachments = email_list['AttachmentPath']
PATH = "C:\\Users\\roy\\myfolder\\"
for i in range(len(emails)):
print("Sending email with " + file)
name = names[i]
email = emails[i]
attachment = attachments[i]
attachment1 = PATH + attachment
with open(attachment1, 'r') as my_attachment:
myfile = my_attachment.read()
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = email
mail.Subject = 'Message subject'
mail.Body = 'Hello ' + name
mail.Attachments.Add(attachment1)
mail.Send()
break