如何使用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()
注意事项
- content_id匹配:这是图片正常显示的关键,必须保证附件的
content_id和原HTML中图片的cid完全一致,包括大小写和文件后缀 - 二进制读取图片:必须用
rb模式读取图片文件,避免编码损坏图片内容 - 回复对象优化:若直接回复原邮件,使用
original_message.reply()生成回复对象更高效,无需手动设置收件人、主题等信息
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

