Python实现HTML邮件内嵌图片时如何避免图片同时成为附件?
解决HTML邮件内嵌图片同时显示为附件的问题
你的问题根源在于两处不当操作:
- 手动调用
msg.make_mixed()强制邮件转为mixed类型,该类型下直接附加的内容默认会被标记为附件 - 添加图片时未明确指定资源为内嵌显示,导致邮件客户端将其识别为普通附件
按以下方式修改代码即可解决:
- 删除
msg.make_mixed()行,EmailMessage会自动根据内容生成合适的多部分结构 - 给MIMEImage对象添加
Content-Disposition头,明确标记为inline(内嵌),配合Content-ID供HTML引用
修改后的完整代码:
#!/usr/bin/python3 import smtplib from email.message import EmailMessage from email import encoders from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.audio import MIMEAudio import mimetypes strFrom = 'Me@some.com' strPWord = 'XYZ' strTo = 'Recipient@GMail.com' msg = EmailMessage() msg['Subject'] = 'This is a test at 1:22' msg['From'] = strFrom msg['To'] = strTo msg.set_content(''' <!DOCTYPE html> <html> <body> <p><img src="cid:image1"/></p> <p>Python email test</p> <p><img src="cid:image2"/></p> </body> </html> ''', subtype='html') # Attach Any Images images = '''/Users/my/Desktop/RKw.jpeg\n/Users/my/Desktop/logo.png'''.splitlines() i=1 for image in images: fp = open(image, 'rb') msgImage = MIMEImage(fp.read()) fp.close() # 定义图片ID msgImage.add_header('Content-ID', f'<image{i}>') # 关键:设置为内嵌显示,避免被当成附件 msgImage.add_header('Content-Disposition', 'inline', filename=f'image{i}.jpeg') msg.attach(msgImage) i+=1 # Attach any files files = ''''''.splitlines() for file in files: ctype, encoding = mimetypes.guess_type(file) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) with open(file, 'rb') as fp: msg.add_attachment(fp.read(), maintype=maintype, subtype=subtype, filename=file.split('/')[-1].replace(' ','%20')) with smtplib.SMTP_SSL('smtpserver.com', 465) as smtp: smtp.login(strFrom, strPWord) smtp.send_message(msg)
补充说明:
- 后续添加普通附件时,直接使用
msg.add_attachment()即可,EmailMessage会自动区分内嵌资源和普通附件 Content-Disposition中的filename参数为可选,仅用于指定图片文件名,不影响内嵌显示,但能提升不同邮件客户端的兼容性
内容的提问来源于stack exchange,提问作者JAC
相关产品推荐
相关产品推荐

