win32com.client para enviar diferentes archivos adjuntos en lugar de una ruta de archivo fija
Puedo enviar correos electrónicos a diferentes destinatarios en Outlook con el siguiente script para un solo archivo adjunto, pero si intento enviar diferentes archivos adjuntos a cada usuario que usa el bucle for, falla.
Actualmente, el script está usando attachment = r'C:\Users\roy\Royfile.csv'
. Pero quiero attachment = file
, para que el archivo adjunto cambie en cada bucle for para diferentes usuarios. Esta parte no funciona.
Diferentes archivos para diferentes usuarios, ejemplo a Royfile.csv
continuación. Pero hay 50 archivos más de este tipo.
Folder FolderOwner EmailAddress AttachmentPath
C:\folder1\ Roy [email protected] Royfile.csv
D:\folder2\ Roy [email protected] Royfile.csv
2do archivo en la misma carpeta Jackfile.csv
:
Folder FolderOwner EmailAddress AttachmentPath
C:\folder3\ Jack [email protected] Jackfile.csv
D:\folder4\ Jack [email protected] Jackfile.csv
3er archivo, por ejemplo Mandyfile.csv
. Y de la misma manera un total de 50 archivos para 50 usuarios en la misma carpeta.
Folder FolderOwner EmailAddress AttachmentPath
C:\folder5\ Mandy [email protected] Mandyfile.csv
D:\folder6\ Mandy [email protected] Mandyfile.csv
Script de 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
Salida actual del script si elimino la parte adjunta:
Royfile.csv
Royfile.csv
Jackfile.csv
Jackfile.csv
Mandyfile.csv
Mandyfile.csv
...
..
.
Luchando ahora con lo que debe ser para el apego = ???. Para que cada archivo se envíe a 50 usuarios.
Respuestas
No sé cómo se nombran sus archivos cómo se distribuyen en diferentes carpetas, intente poner todos sus nombres junto con las rutas en la hoja de Excel en una columna e iterar a través de ellos de la manera que lo está haciendo para los nombres y correos
attachment = r'{}.csv'.format(filepaths from excel sheet)
with open(attachment, 'r') as my_attachment:
myfile = my_attachment.read()
Finalmente encontré la respuesta para mi pregunta, a continuación se muestra el código completo. El error venía, ya que faltaba PATH. win32com lib necesita una ruta completa incluso si el script se ejecuta en la misma carpeta que los archivos adjuntos. funciona perfectamente ahora. :)
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