如何循环打开一个文本文件并在发送电子邮件时保持打开状态?

How to loop through an open text file and stay open while emails are being sent?

我正在使用 win32com.client 连接到我的 outlook 以定期发送批量电子邮件。

我有一个包含电子邮件正文的文本文档,但当我遍历它时,在第一封电子邮件之后,所有后续电子邮件都是空白的,而不是文本文档:

outlook = win32.Dispatch('outlook.application')
with open(email_txt_doc, 'r') as f:
    for company, contacts in contacts_dict.items():
        mail = outlook.CreateItem(0)
        mail.To = contacts
        mail.Subject = 'Recurring Email'
        mail.Body = f.read() + '\n\n' + strategies_dict[company]
        mail.Attachments.Add(filepath/file.xlsx)
        mail.Send()

但是,文本文档 'f' 在第一个循环后停止读入,所有其他电子邮件都是空白的,或者只有我的 strategies_dict.

的值

示例:

电子邮件 1:

请在 7 月 31 日之前完成 return 下面列出的 strategy/ies 第二季度 RFI。为方便起见,我们附上了我们的三个模板——股票、国际和固定收益。

完成后,请将 RFI 转发给我。如果您有任何问题,请随时与我联系。

提前感谢您的帮助。

Strategy_A1

Strategy_A2

...

Strategy_An


邮箱2:

Strategy_B1

Strategy_B2

...

Strategy_Bn


我该如何解决这个问题?

当您在一个文件上使用 read() 时,它只能使用一次。要解决此问题,请将读取值分配给变量。

with open('yourfile.txt', 'r') as f:
    temp = f.read()

Temp 现在等于读取值,可以替换。

我想你可以像这样稍微转动一下线条。您可以阅读邮件正文,然后根据需要在 "with" 语句外的 for 循环中添加公司的个人 strategies_dict。

outlook = win32.Dispatch('outlook.application')
with open(email_txt_doc, 'r') as f:
    main_mail_body_from_file = f.read() + '\n\n'

for company, contacts in contacts_dict.items()
    mail = outlook.CreateItem(0)
    mail.To = contacts
    mail.Subject = 'Recurring Email'
    mail.Body = main_mail_body_from_file + strategies_dict[company]
    mail.Attachments.Add(filepath/file.xlsx)
    mail.Send()

我可能会添加一个检查以确保公司在 strategies_dict 和 contacts_dict 中,即使它们都是 defaultdicts,否则承诺的附件可能不会出现。