win32com.client per inviare allegati diversi invece del percorso file fisso
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.csv
sotto. 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
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()
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