win32com.clientは、固定ファイルパスの代わりに異なる添付ファイルを送信します

Aug 18 2020

単一の添付ファイルの以下のスクリプトを使用して、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

同じフォルダ内の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

ファイルの名前がどのように異なるフォルダーに分散されているのかわかりません。すべての名前とパスを1つの列にエクセルシートに入れて、名前とメールの場合と同じように繰り返してください。

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が欠落しているため、エラーが発生していました。スクリプトが添付ファイルと同じフォルダーで実行されている場合でも、win32comlibにはフルパスが必要です。今は完璧に動作します。:)

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