win32com.client untuk mengirim lampiran berbeda alih-alih jalur file tetap

Aug 18 2020

Saya dapat mengirim email ke penerima yang berbeda pada pandangan dengan skrip di bawah ini untuk lampiran tunggal, tetapi jika saya mencoba mengirim lampiran yang berbeda ke setiap pengguna menggunakan for loop, maka gagal.

Saat ini skrip sedang digunakan attachment = r'C:\Users\roy\Royfile.csv'. Tapi saya ingin attachment = file, sehingga lampiran berubah di setiap loop for untuk pengguna yang berbeda. Bagian ini tidak berfungsi.

File berbeda untuk pengguna berbeda, contoh di Royfile.csvbawah ini. Tapi ada 50 file seperti itu.

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

File ke-2 di folder yang sama Jackfile.csv:

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

File ke-3 misalnya Mandyfile.csv. Dan dengan cara yang sama total 50 file untuk 50 pengguna dalam folder yang sama.

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

Skrip 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

Output skrip saat ini jika saya menghapus bagian lampiran:

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

Berjuang sekarang dengan apa yang dibutuhkan untuk keterikatan = ???. Sehingga setiap file dikirim ke 50 pengguna.

Jawaban

SrinathNeela Aug 18 2020 at 16:41

Saya tidak tahu bagaimana nama file Anda bagaimana mereka didistribusikan di folder yang berbeda, coba masukkan semua nama mereka bersama dengan jalur di lembar excel dalam satu kolom dan ulangi melalui mereka seperti yang Anda lakukan untuk nama dan surat

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

Menemukan jawaban untuk pertanyaan saya akhirnya, di bawah ini adalah kode lengkap. Kesalahan datang, karena ada PATH yang hilang. win32com lib membutuhkan jalur lengkap meskipun skrip berjalan di folder yang sama dengan lampiran. bekerja dengan sempurna sekarang. :)

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