发送多个文件功能仅发送列表中的最后一个文件并忽略其他文件

Posted

技术标签:

【中文标题】发送多个文件功能仅发送列表中的最后一个文件并忽略其他文件【英文标题】:Sending multiple files function only sends the last file in a list and ignores the others 【发布时间】:2020-04-02 20:33:14 【问题描述】:

我有一个功能可以通过电子邮件发送多个文件作为附件。

但由于某种原因,它只发送列表中指定的最后一个文件:

files=['AlignEnvironmentalPremium.txt', 'TestFile.xlsx']

它只会发送TestFile.xlsx而忽略AlignEnvironmentalPremium.txt

我是否需要更改代码中的某些内容以发送列表中的所有文件,而不仅仅是最后一个?

import os
from base64 import decodebytes 
from xlsxwriter.utility import xl_rowcol_to_cell
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders
import datetime

send_from = 'sendfrom@.usercom'
send_to = ['sendto@.usercom']
cc = ['copyto@.usercom']
rcpt = COMMASPACE.join(send_to).split(',') +  COMMASPACE.join(cc).split(',')
subject = 'Monthly Audit Report' 
text = 'Hello, \nPlease, see attached'
files=['AlignEnvironmentalPremium.txt', 'TestFile.xlsx']

# below function sends email
def send_mail(send_from,rcpt,subject,text ,files):
    assert isinstance(send_to, list)
    assert isinstance(cc, list)
    assert isinstance(files, list)
    msg = MIMEMultipart()
    msg["From"] = send_from
    msg["To"] = COMMASPACE.join(send_to)
    msg['Cc'] = COMMASPACE.join(cc)
    msg["Date"] = formatdate(localtime=True)
    msg["Subject"] = subject
    msg.attach(MIMEText(text))
    if files is not None:
        for f in files:
            part = MIMEBase("application", "octet-stream")
            part.set_payload(open(f, "rb").read())
            encoders.encode_base64(part)
            part.add_header(
                "Content-Disposition", 'attachment; filename="%s"' % os.path.basename(f)
            )   
        msg.attach(part)
    smtp = smtplib.SMTP('0.0.0.0: 25')
    smtp.sendmail(send_from, rcpt, msg.as_string())     
    smtp.close()
send_mail(send_from,rcpt,subject,text,files)

【问题讨论】:

【参考方案1】:

我不熟悉电子邮件库,所以我可能遗漏了一些细微差别,但我认为这只是语法错误。

您正在为每个文件创建一个 MIMEBase 实例并将其命名为 part。在 for 循环结束时,part 的值将是您迭代的最后一个文件。由于msg.attach(part) 在您的 for 循环之外,您只会附加文件列表中的最后一个文件。

我想你知道从这里去哪里。

【讨论】:

哦!感谢您的快速回复!

以上是关于发送多个文件功能仅发送列表中的最后一个文件并忽略其他文件的主要内容,如果未能解决你的问题,请参考以下文章

Python for 循环仅将最后一个列表作为值附加

在 Azure 存储中创建文件列表并使用 ADF 将其发送到 sql 表

通过 Codeigniter 发送带附件的电子邮件时出错

如何将多个功能/选项发送到多个列表项?

发生一个或多个错误。(发送请求时发生错误)Mailchimp 列表集成

使用Mailchimp RSS仅发送最后发布