win32com.client para enviar diferentes anexos em vez de um caminho de arquivo fixo
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.csv
abaixo. 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
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()
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