win32com.client per inviare allegati diversi invece del percorso file fisso

Aug 18 2020

Sono in grado di inviare e-mail a diversi destinatari su Outlook con lo script sottostante per un singolo allegato, ma se provo a inviare allegati diversi a ciascun utente utilizzando il ciclo for, non funziona.

Attualmente lo script sta usando attachment = r'C:\Users\roy\Royfile.csv'. Ma voglio attachment = file, in modo che l'allegato cambi in ogni ciclo for per utenti diversi. Questa parte non funziona.

File diversi per utenti diversi, esempio Royfile.csvsotto. Ma ci sono altri 50 file di questo tipo.

Folder        FolderOwner    EmailAddress      AttachmentPath
C:\folder1\   Roy            [email protected]     Royfile.csv
D:\folder2\   Roy            [email protected]     Royfile.csv

2 ° file nella stessa cartella Jackfile.csv:

Folder        FolderOwner    EmailAddress      AttachmentPath  
C:\folder3\   Jack            [email protected]   Jackfile.csv
D:\folder4\   Jack            [email protected]   Jackfile.csv 

3 ° file per esempio Mandyfile.csv. E allo stesso modo totale 50 file per 50 utenti nella stessa cartella.

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

Output corrente dello script se rimuovo la parte in allegato:

Royfile.csv
Royfile.csv
Jackfile.csv
Jackfile.csv
Mandyfile.csv
Mandyfile.csv
...
..
.

Lottando ora con ciò che deve essere per attaccamento = ???. In modo che ogni file venga inviato a 50 utenti.

Risposte

SrinathNeela Aug 18 2020 at 16:41

Non so come i tuoi file abbiano chiamato il modo in cui sono distribuiti in cartelle diverse, prova a mettere tutti i loro nomi insieme ai percorsi nel foglio Excel in una colonna e itera attraverso di essi come stai facendo per i nomi e le mail

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

Alla fine ho trovato la risposta alla mia domanda, di seguito è riportato il codice completo. L'errore stava arrivando, poiché mancava PATH. win32com lib richiede il percorso completo anche se lo script è in esecuzione nella stessa cartella degli allegati. funziona perfettamente ora. :)

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