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

问题描述 投票:0回答:1

我具有将多个文件作为附件通过电子邮件发送的功能。

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

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 = '[email protected]'
send_to = ['[email protected]']
cc = ['[email protected]']
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)
python python-3.x smtp mime
1个回答
1
投票

我不熟悉电子邮件库,所以也许我缺少一个细微差别,但是我认为这只是语法上的误解。

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

我认为您知道从这里去哪里。

© www.soinside.com 2019 - 2024. All rights reserved.