win32com.client发送不同的附件而不是固定文件路径

问题描述

我可以使用单个脚本的以下脚本向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

同一文件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个用户

解决方法

我不知道您的文件如何命名它们在不同文件夹中的分布方式,尝试将它们的所有名称以及路径放在excel工作表中的一栏中,然后按照您对名称和邮件的处理方式对其进行迭代>

attachment = r'{}.csv'.format(filepaths from excel sheet)
   with open(attachment,'r') as my_attachment:
      myfile = my_attachment.read()
,

终于找到了我的问题的答案,下面是完整的代码。 由于缺少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