Python3实现带多张图片附件的邮件发送代码详解
本文提供Python3环境下发送包含多张图片附件邮件的完整代码实现。重点解析了在构建MIMEMultipart对象时,如何将HTML内容与图片资源正确关联,并解决for循环生成mail_msg后直接attach导致的附件显示异常问题。通过示例代码展示如何批量添加图片及设置邮件头信息,帮助开发者快速掌握复杂邮件发送技巧。
Python3发送多图片邮件代码实现
本文分享了一个使用Python3实现发送包含多张图片附件邮件的具体代码示例,供读者参考学习。
以下是完整的代码实现,未添加额外注释,直接展示核心逻辑。
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
class Mail(object):
def __init__(self, host, nickname, username, password, postfix):
self.host = host
self.nickname = nickname
self.username = username
self.password = password
self.postfix = postfix
def send_mail(self, to_list, subject, content, cc_list=[], encode='gbk', is_html=True, images=[]):
me = str(Header(self.nickname, encode)) + "<" + self.username + "@" + self.postfix + ">"
msg = MIMEMultipart()
msg['Subject'] = Header(subject, encode)
msg['From'] = me
msg['To'] = ','.join(to_list)
msg['Cc'] = ','.join(cc_list)
if is_html:
mail_msg = ''
for i in range(len(images)):
mail_msg += '<p><img src="cid:image%d" height="240" width="320"></p>' % (i+1)
msg.attach(MIMEText(content + mail_msg, 'html', 'utf-8'))
for i, img_name in enumerate(images):
with open(img_name, 'rb') as fp:
img_data = fp.read()
msg_image = MIMEImage(img_data)
msg_image.add_header('Content-ID', '<image%d>' % (i+1))
msg.attach(msg_image)
# 将图片作为附件
# image = MIMEImage(img_data, _subtype='octet-stream')
# image.add_header('Content-Disposition', 'attachment', filename=images[i])
# msg.attach(image)
else:
msg_content = MIMEText(content, 'plain', encode)
msg.attach(msg_content)
try:
s = smtplib.SMTP()
# s.set_debuglevel(1)
s.connect(self.host)
s.login(self.username, self.password)
s.sendmail(me, to_list + cc_list, msg.as_string())
s.quit()
s.close()
return True
except Exception as e:
print(e)
return False
def send_mail(to_list, title, content, cc_list=[], encode='utf-8', is_html=True, images=[]):
content = '<pre>%s</pre>' % content
m = Mail('smtp.163.com', 'TV-APP TEST', 'tvapp_qa', 'ujlnluutpfespgxz', '163.com')
m.send_mail(to_list, title, content, cc_list, encode, is_html, images)
if __name__ == '__main__':
images = [
'1.png',
'2.png',
'3.png',
'4.png',
]
import time
title = 'new images %s' % time.strftime('%H:%M:%S')
content = 'this is attach images %s' % time.time()
send_mail(['x@163.com'], title, content, ['xx@163.com', 'xxx@163.com'], 'utf-8', True, images)
后续注意事项
多图片邮件发送调试技巧
在调试发送包含多张图片的邮件过程中,遇到了一些常见问题,总结如下:
在使用for循环生成mail_msg变量时,不能直接将其作为附件attach,必须将mail_msg与content内容结合后,作为一个整体进行attach操作,否则图片可能无法正常显示。
mail_msg = ''
for i in range(len(images)):
mail_msg += '<p><img src="cid:image%d" height="240" width="320"></p>' % (i+1)
msg.attach(MIMEText(**content** + mail_msg, 'html', 'utf-8'))
以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站获取更多技术资源。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









