我有以下代码附加所有的图像从一个文件夹发送html电子邮件。图像是html文件的一部分,所以它们必须被附加。考虑到有10张图片,我想知道如何以更有效的方式做到这一点。
fp = open('newsletter/bar_chart.png', 'rb')
msgImage1 = MIMEImage(fp.read())
fp.close()
msgImage1.add_header('Content-ID', '<bar_chart>')
msgRoot.attach(msgImage1)
fp = open('newsletter/scatter_plot.png', 'rb')
msgImage2 = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '<scatter_plot>')
msgRoot.attach(msgImage2)
fp = open('newsletter/image3.png', 'rb')
msgImage3 = MIMEImage(fp.read())
fp.close()
msgImage3.add_header('Content-ID', '<image3>')
msgRoot.attach(msgImage3)
fp = open('newsletter/image4.png', 'rb')
msgImage4 = MIMEImage(fp.read())
fp.close()
msgImage4.add_header('Content-ID', '<image4>')
msgRoot.attach(msgImage4)
只需保持文件名为列表,并使用for
-loop对列表中的不同项重复相同的代码。
要获得不同的Content-ID
,您可以简单地使用f-string
,如f"<image{number}>
和enumerate()
。
filenames = [
'newsletter/bar_chart.png',
'newsletter/scatter_plot.png',
'newsletter/image3.png',
'newsletter/image4.png',
]
for number, name in enumerate(filenames, 1):
fp = open(name, 'rb')
msg_image = MIMEImage(fp.read()) # PEP8: `lower_case_names` for variables
fp.close()
msg_image.add_header('Content-ID', f'<image{number}>')
msg_root.attach(msg_image)
这样你可以从
中获取文件名:文件- 数据库
os.listdir('newsletter')
glob.glob('newsletter/*.png')
- 命令行-
python.exe script.py name1 name2
和filenames = sys.argv[1:]
最终你可以用元组(filename, content_id)
创建列表
在列表中,您可以使用字符串"<image4>"
,或者您可以使用字符串"image4"
,然后使用f-string
添加< >
-f"<{content_id}>"
。
filenames = [
('newsletter/bar_chart.png', 'bar_chart'),
('newsletter/scatter_plot.png', 'scatter_plot'),
('newsletter/image3.png', 'image3'),
('newsletter/image4.png', 'image4'),
]
for name, content_id in filenames:
fp = open(name, 'rb')
msg_image = MIMEImage(fp.read()) # PEP8: `lower_case_names` for variables
fp.close()
msg_image.add_header('Content-ID', f'<{content_id}>')
msg_root.attach(msg_image)
最终您可以使用名称newsletter/bar_chart.png
来创建content_id
。
content_id = name.split('/')[-1].split('.')[0]
给出bar_chart
PEP 8——Python代码风格指南