You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用exchangelib在邮件正文中添加多张嵌入图片并回复HTML邮件

用exchangelib回复HTML邮件并保留内嵌图片

要实现回复HTML邮件并保留原邮件中的所有图片,核心是把保存的图片作为内嵌附件添加到回复邮件中,并确保HTML正文里的图片引用和附件的content_id一一对应。以下是具体步骤和代码示例:

关键要点

  • 每张图片必须以内嵌附件(is_inline=True)的形式添加到邮件
  • 附件的content_id必须和原邮件HTML中<img>标签的src="cid:xxx"里的xxx完全一致,否则邮件客户端无法加载图片
  • 回复的HTML正文要保留原邮件的图片引用结构

代码实现

from exchangelib import HTMLBody, Message, FileAttachment

# 假设你已经获取到原邮件的HTML内容,也可以直接使用你保存的原HTML文本
original_html = """<html><body>原邮件内容:<img src="cid:photo1.jpg"><img src="cid:logo.png"></body></html>"""
# 保存的图片路径及对应的content_id(需和原HTML里的cid严格对应)
image_info = [
    {"file_path": "./保存的photo1.jpg", "content_id": "photo1.jpg"},
    {"file_path": "./保存的logo.png", "content_id": "logo.png"}
]

# 创建回复邮件对象(如果是回复特定邮件,推荐用原邮件的reply()方法生成Reply对象,自动带收件人、Re:主题前缀)
reply_msg = Message()

# 逐个添加内嵌图片附件
for img in image_info:
    with open(img["file_path"], 'rb') as f:
        img_attachment = FileAttachment(
            name=img["file_path"].split("/")[-1],  # 文件名仅作标识,不影响图片显示
            content=f.read(),
            is_inline=True,
            content_id=img["content_id"]  # 核心:与原HTML中的cid完全匹配
        )
        reply_msg.attach(img_attachment)

# 构建回复正文:可在原HTML前添加你的回复内容,也直接复用原HTML
reply_body = f"""<html><body>
<p>这是我的回复内容...</p>
<hr>
{original_html}
</body></html>"""
reply_msg.body = HTMLBody(reply_body)

# 执行发送(如果是Reply对象,直接调用send()即可)
# reply_msg.send()

注意事项

  1. content_id匹配:这是图片正常显示的关键,必须保证附件的content_id和原HTML中图片的cid完全一致,包括大小写和文件后缀
  2. 二进制读取图片:必须用rb模式读取图片文件,避免编码损坏图片内容
  3. 回复对象优化:若直接回复原邮件,使用original_message.reply()生成回复对象更高效,无需手动设置收件人、主题等信息

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:25:34