发送多个文件功能仅发送列表中的最后一个文件而忽略其他文件
Sending multiple files function only sends the last file in a list and ignores the others
我有一个功能,可以将多个文件作为附件通过电子邮件发送。
但出于某种原因,它只发送列表中指定的最后一个文件:
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)
我不熟悉电子邮件库,所以我可能遗漏了一个细微差别,但我认为这只是一个语法错误。
您正在为每个文件创建一个 MIMEBase 实例并调用它 part
。在 for 循环结束时,part
的值将是您迭代的最后一个文件。由于 msg.attach(part)
在您的 for 循环之外,您将只附加文件列表中的最后一个文件。
我想你知道从这里去哪里了。
我有一个功能,可以将多个文件作为附件通过电子邮件发送。
但出于某种原因,它只发送列表中指定的最后一个文件:
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)
我不熟悉电子邮件库,所以我可能遗漏了一个细微差别,但我认为这只是一个语法错误。
您正在为每个文件创建一个 MIMEBase 实例并调用它 part
。在 for 循环结束时,part
的值将是您迭代的最后一个文件。由于 msg.attach(part)
在您的 for 循环之外,您将只附加文件列表中的最后一个文件。
我想你知道从这里去哪里了。