win32com.client เพื่อส่งไฟล์แนบที่แตกต่างกันแทนที่จะใช้เส้นทางไฟล์คงที่

Aug 18 2020

ฉันสามารถส่งอีเมลไปยังผู้รับที่แตกต่างกันใน Outlook ด้วยสคริปต์ด้านล่างสำหรับไฟล์แนบเดียว แต่ถ้าฉันพยายามส่งไฟล์แนบที่แตกต่างกันไปให้ผู้ใช้แต่ละคนโดยใช้สำหรับการวนซ้ำมันก็ล้มเหลว

attachment = r'C:\Users\roy\Royfile.csv'ปัจจุบันสคริปต์ที่ใช้ แต่ฉันต้องการattachment = fileเพื่อให้ไฟล์แนบเปลี่ยนไปในแต่ละวงสำหรับผู้ใช้ที่แตกต่างกัน ส่วนนี้ไม่ทำงาน

ไฟล์ที่แตกต่างกันสำหรับผู้ใช้ที่แตกต่างกันตัวอย่าง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