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

2024-06-28 20:47:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以使用下面的脚本向outlook上的不同收件人发送电子邮件,但如果我尝试使用for loop向每个用户发送不同的附件,那么它就会失败

当前脚本正在使用attachment = r'C:\Users\roy\Royfile.csv'。但是我想要attachment = file,这样每个for循环中的附件都会针对不同的用户进行更改。这部分不起作用

不同用户的不同文件,例如下面的Royfile.csv。但是还有50多个这样的文件

Folder        FolderOwner    EmailAddress      AttachmentPath
C:\folder1\   Roy            Roy@gmail.com     Royfile.csv
D:\folder2\   Roy            Roy@gmail.com     Royfile.csv

同一文件夹中的第二个文件Jackfile.csv

Folder        FolderOwner    EmailAddress      AttachmentPath  
C:\folder3\   Jack            Jack@gmail.com   Jackfile.csv
D:\folder4\   Jack            Jack@gmail.com   Jackfile.csv 

第三个文件,例如Mandyfile.csv。以同样的方式,在同一文件夹中为50个用户总计50个文件

Folder        FolderOwner    EmailAddress        AttachmentPath
C:\folder5\   Mandy            Mandy@gmail.com   Mandyfile.csv
D:\folder6\   Mandy            Mandy@gmail.com   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个用户


Tags: 文件csv用户脚本comforattachmentemail
2条回答

我不知道您的文件是如何命名的,它们是如何分布在不同的文件夹中的,请尝试将它们的所有名称以及excel工作表中的路径放在一列中,并像对待名称和邮件那样对它们进行迭代

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

终于找到了我问题的答案,下面是完整的代码。 由于缺少路径,错误即将发生。 即使脚本与附件在同一文件夹中运行,win32com库也需要完整路径。 现在可以很好地工作了。:)

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

相关问题 更多 >