win32com.client को निश्चित फ़ाइल पथ के बजाय विभिन्न अनुलग्नक भेजने के लिए

Aug 18 2020

मैं एकल अनुलग्नक के लिए नीचे स्क्रिप्ट के साथ आउटलुक पर अलग-अलग प्राप्तकर्ताओं को ईमेल भेजने में सक्षम हूं, लेकिन अगर मैं प्रत्येक उपयोगकर्ता के लिए लूप का उपयोग करने के लिए अलग-अलग अनुलग्नक भेजने का प्रयास करता हूं, तो यह विफल हो जाता है।

वर्तमान में स्क्रिप्ट का उपयोग कर रहा है 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

उसी फ़ोल्डर में दूसरी फ़ाइल 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

पायथन लिपि

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

मुझे नहीं पता कि आपकी फ़ाइलों का नाम कैसे उन्हें विभिन्न फ़ोल्डरों में वितरित किया गया है, अपने सभी नामों को एक कॉलम में एक्सेल शीट में पथों के साथ डालने का प्रयास करें और उनके माध्यम से जिस तरह से आप नाम और मेल के लिए कर रहे हैं, उसके माध्यम से पुनरावृत्ति करें

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

मेरे प्रश्न का अंतिम उत्तर मिला, नीचे पूर्ण कोड है। त्रुटि आ रही थी, क्योंकि वहाँ पैट गायब था। 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