win32com.client para enviar diferentes archivos adjuntos en lugar de una ruta de archivo fija

Aug 18 2020

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.csvcontinuació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

SrinathNeela Aug 18 2020 at 16:41

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

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