如何使用Python email库通过SMTP发送含内嵌图片的HTML格式邮件
Python SMTP发送含内嵌图片HTML邮件的正确实现
内嵌图片通过CID(内容ID)关联HTML内容和邮件资源,正确实现代码如下:
import smtplib from email.message import EmailMessage from email.utils import make_msgid # 初始化邮件对象,配置基础信息 msg = EmailMessage() msg['Subject'] = '带内嵌图片的测试邮件' msg['From'] = '发件人邮箱@xxx.com' msg['To'] = '收件人邮箱@xxx.com' # 生成图片唯一CID标识 asparagus_cid = make_msgid() # 配置纯文本备选内容,兼容不支持HTML的邮件客户端 msg.set_content('这是纯文本备选内容,仅在客户端不支持HTML时展示') # 添加HTML正文内容,CID需要移除make_msgid返回值首尾的尖括号 msg.add_alternative(f"""\ <html> <head></head> <body> <p>您好!</p> <p>这是一份带内嵌图片的测试邮件</p> <img src="cid:{asparagus_cid[1:-1]}" alt="图片描述"/> </body> </html> """, subtype='html') # 关联本地图片资源到对应CID with open("roasted-asparagus.jpg", 'rb') as img: # 直接取HTML部分的payload,无需硬编码索引,兼容性更高 msg.get_payload()[1].add_related(img.read(), 'image', 'jpeg', cid=asparagus_cid) # 连接SMTP服务发送邮件,此处以QQ邮箱为例,其他服务商替换对应SMTP地址和端口即可 with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp: smtp.login('发件人邮箱@xxx.com', '邮箱SMTP授权码') smtp.send_message(msg)
注意事项
- 授权码说明:SMTP登录使用的授权码不是邮箱登录密码,需要在对应邮箱的设置页面开启SMTP服务后单独获取
- 多图适配:如果需要嵌入多张图片,为每张图片生成独立的CID,分别关联对应图片资源即可
- 格式适配:如果嵌入的是png、gif等其他格式图片,将
add_related方法中的jpeg参数修改为对应格式标识即可
内容的提问来源于stack exchange,提问作者istwine
相关产品推荐
相关产品推荐

