如何一次发送多封电子邮件,每个电子邮件都带有一个 xlsx 文件附件?

Posted

技术标签:

【中文标题】如何一次发送多封电子邮件,每个电子邮件都带有一个 xlsx 文件附件?【英文标题】:How to send multiple e-mails at once with one xlsx file attachment each? 【发布时间】:2019-05-18 22:21:13 【问题描述】:

我正在编写一个 Python 脚本,它在目录中搜索具有特定名称的 .XLSX 文件,然后发送附有这些文件的电子邮件。 如果该目录中有 3 个 XLSX 文件,我想发送 3 封电子邮件,每封电子邮件都附有一个文件。我的代码发生了什么,在那个例子中,它发送了 3 封电子邮件:

第一封附有 1 个文件的电子邮件 第二个附加了 2 个文件 第三个附加了 3 个文件

我尝试将文件作为电子邮件附件后移动到另一个目录,但没有成功。代码如下:

     for xlsxfile in glob.glob(os.path.join('.', 'START_OF_FILENAME_*.XLSX')):

         xlsxpart = MIMEApplication(open(xlsxfile, 'rb').read())
         xlsxpart.add_header('Content-Disposition', 'attachment', filename=xlsxfile[1:])
         msg.attach(xlsxpart)

         shutil.move(xlsxfile, './sent/'+xlsxfile[2:])

         try:

              client = smtplib.SMTP()
              client.connect('XX.XXX.XX.XX', port=25)
              client.sendmail(username, rcptlist, msg.as_string())
              client.quit()
          #...exception handling

【问题讨论】:

【参考方案1】:
for xlsxfile in glob.glob(os.path.join('.', 'START_OF_FILENAME_*.XLSX')):
    ...
    msg.attach(xlsxpart)
    ...

在每次迭代中,当前文件都被添加到现有的msg 对象中。当循环进入第三次迭代时,msg 已经附加了前两个文件。

相反,每次迭代都应该创建一个新的msg 对象:

for xlsxfile in glob.glob(os.path.join('.', 'START_OF_FILENAME_*.XLSX')):
    ...
    msg = Message(...) # however you created msg before the loop
    msg.attach(xlsxpart)
    ...

【讨论】:

以上是关于如何一次发送多封电子邮件,每个电子邮件都带有一个 xlsx 文件附件?的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件表单根据附件发送多封邮件

使用 asp.net 发送 20,000 多封电子邮件

这是在Laravel中一次发送多封邮件的好方法吗?

对多封电子邮件执行一次批处理脚本

无法在多封电子邮件中重复使用电子邮件附件

如何使用 Codeigniter 通过 cc 发送多封电子邮件?