win32com.client para enviar diferentes anexos em vez de um caminho de arquivo fixo

Aug 18 2020

Posso enviar e-mail para destinatários diferentes no Outlook com o script abaixo para anexo único, mas se tento enviar anexos diferentes para cada usuário usando o loop for, ele falha.

Atualmente, o script está usando attachment = r'C:\Users\roy\Royfile.csv'. Mas eu quero attachment = file, para que o anexo mude em cada loop for para diferentes usuários. Esta parte não está funcionando.

Arquivos diferentes para usuários diferentes, exemplo Royfile.csvabaixo. Mas existem mais 50 desses arquivos.

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

2º arquivo na mesma pasta Jackfile.csv:

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

3º arquivo, por exemplo Mandyfile.csv. E da mesma forma total 50 arquivos para 50 usuários na mesma pasta.

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

Saída atual do script se eu remover a parte do anexo:

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

Lutando agora com o que precisa ser para apego = ???. Para que cada arquivo seja enviado para 50 usuários.

Respostas

SrinathNeela Aug 18 2020 at 16:41

Eu não sei como seus arquivos nomearam como eles são distribuídos em pastas diferentes, tente colocar todos os seus nomes junto com os caminhos na planilha do excel em uma coluna e iterar através deles da maneira que você está fazendo para nomes e e-mails

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 encontrei a resposta para minha pergunta, abaixo está o código completo. O erro estava chegando, pois faltava PATH. win32com lib precisa do caminho completo, mesmo se o script estiver sendo executado na mesma pasta dos anexos. funciona perfeitamente agora. :)

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