win32com.client pour envoyer différentes pièces jointes au lieu d'un chemin de fichier fixe

Aug 18 2020

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.csvci-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

SrinathNeela Aug 18 2020 at 16:41

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()
ukki Aug 31 2020 at 00:56

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