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

在Django中使用EmailMultiAlternatives生成并导出.eml文件

嘿,这个需求我刚好处理过!其实用Django的EmailMultiAlternatives生成可下载的.eml文件完全可行,不用真的发送邮件,核心就是利用它生成MIME消息的能力。下面给你一步步拆解实现方法:

步骤1:构建EmailMultiAlternatives实例

先按照你平时准备发送邮件的方式创建实例,只是不要调用send()方法。比如:

from django.core.mail import EmailMultiAlternatives

# 填充邮件基本信息,和你现有代码一致
subject = "客户需求确认邮件"
from_email = "your_team@company.com"
to_emails = ["client@example.com"]
text_content = "这是给客户的纯文本邮件内容"
html_content = "<p>这是给客户的<b>HTML格式</b>邮件内容</p>"

# 创建EmailMultiAlternatives对象
msg = EmailMultiAlternatives(subject, text_content, from_email, to_emails)
# 添加HTML替代内容
msg.attach_alternative(html_content, "text/html")

# 如果需要添加附件,和发送邮件时的写法一样
# msg.attach("报价单.pdf", open("path/to/报价单.pdf", "rb").read(), "application/pdf")

步骤2:生成.eml格式的字节内容

EmailMultiAlternatives继承自EmailMessage,而EmailMessage的message()方法会返回一个标准的MIME消息对象。我们可以调用这个对象的as_bytes()方法,直接得到符合.eml格式的原始字节数据:

# 生成MIME消息对象
mime_message = msg.message()
# 转换为.eml格式的字节内容
eml_data = mime_message.as_bytes()

步骤3:在Django视图中返回下载响应

把上面的逻辑放到视图函数里,通过HttpResponse返回.eml数据,并设置正确的响应头,让浏览器触发下载行为:

from django.http import HttpResponse
from urllib.parse import quote

def download_eml_file(request):
    # 这里放入步骤1和步骤2的代码
    subject = "客户需求确认邮件"
    from_email = "your_team@company.com"
    to_emails = ["client@example.com"]
    text_content = "这是给客户的纯文本邮件内容"
    html_content = "<p>这是给客户的<b>HTML格式</b>邮件内容</p>"

    msg = EmailMultiAlternatives(subject, text_content, from_email, to_emails)
    msg.attach_alternative(html_content, "text/html")
    
    mime_message = msg.message()
    eml_data = mime_message.as_bytes()

    # 构造下载响应
    response = HttpResponse(eml_data, content_type="message/rfc822")
    # 处理文件名中的特殊字符(比如中文、空格),避免浏览器解析错误
    filename = f"{subject.replace(' ', '_')}.eml"
    encoded_filename = quote(filename)
    # 设置响应头,指定为附件下载
    response["Content-Disposition"] = f'attachment; filename="{encoded_filename}"'

    return response

额外注意事项

  • 如果需要添加抄送、密送或者自定义邮件头(比如Reply-To),直接给msg对象设置属性即可:
    # 添加抄送
    msg.cc = ["cc_recipient@example.com"]
    # 添加密送
    msg.bcc = ["bcc_recipient@example.com"]
    # 添加自定义邮件头
    msg.extra_headers = {"Reply-To": "support@company.com"}
    
  • 生成的.eml文件可以直接用Outlook、Thunderbird等邮件客户端打开,用户能直接修改内容后发送,完全满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:25:21