win32com.client для отправки разных вложений вместо фиксированного пути к файлу

Aug 18 2020

Я могу отправлять электронную почту разным получателям в Outlook с помощью приведенного ниже сценария для одного вложения, но если я попытаюсь отправить разные вложения каждому пользователю с помощью цикла for, это не удастся.

В настоящее время скрипт использует attachment = r'C:\Users\roy\Royfile.csv'. Но я хочу attachment = file, чтобы вложения менялись в каждом цикле for для разных пользователей. Эта часть не работает.

Разные файлы для разных пользователей, пример Royfile.csvниже. Но таких файлов еще 50.

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

2-й файл в той же папке Jackfile.csv:

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

3-й файл например Mandyfile.csv. И таким же образом всего 50 файлов для 50 пользователей в одной папке.

Folder        FolderOwner    EmailAddress        AttachmentPath
C:\folder5\   Mandy            [email protected]   Mandyfile.csv
D:\folder6\   Mandy            [email protected]   Mandyfile.csv

Скрипт 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

Текущий результат скрипта, если я удалю часть прикрепления:

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

Сейчас борюсь с тем, что нужно для прикрепления = ???. Таким образом, каждый файл отправляется 50 пользователям.

Ответы

SrinathNeela Aug 18 2020 at 16:41

Я не знаю, как ваши файлы называются, как они распределены в разных папках, попробуйте поместить их все имена вместе с путями в листе Excel в один столбец и перебирать их, как вы делаете для имен и писем

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

Наконец-то нашел ответ на свой вопрос, ниже полный код. Ошибка возникала, так как отсутствовал PATH. Win32com lib требуется полный путь, даже если сценарий запущен в той же папке, что и вложения. теперь работает отлично. :)

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