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

求助:基于C#后端生成带附件的EML文件,适配前端Outlook需求

C#后端生成带附件的EML文件返回前端实现方案

核心思路

EML是遵循RFC 822标准的邮件格式,Outlook可直接打开并识别其中的附件。我们通过C#构建包含目标附件的MailMessage对象,将其序列化为EML格式的流返回给前端,前端下载后即可用Outlook打开带附件的邮件。

修正并替换现有后端代码

先修正你现有代码的错误(File.Exists返回布尔值,不能直接赋值给字节数组),替换为生成EML的逻辑:

public async Task<IActionResult> GenerateEmailWithAttachment(string id)
{
    var fileDetail = await service.DownloadFile(id);

    // 检查文件是否存在并读取字节数组
    if (!File.Exists(fileDetail.Path))
    {
        return NotFound("目标文件不存在");
    }
    var fileBytes = File.ReadAllBytes(fileDetail.Path);

    // 创建MailMessage实例,无需收件人/主题可留空
    using (var mailMessage = new System.Net.Mail.MailMessage())
    {
        // 添加附件:传入文件字节、文件名和对应MIME类型
        var attachment = new System.Net.Mail.Attachment(
            new MemoryStream(fileBytes), 
            fileDetail.DownloadFileName, 
            fileDetail.MimeType
        );
        mailMessage.Attachments.Add(attachment);

        // 将MailMessage写入流生成EML内容
        using (var emlStream = new MemoryStream())
        {
            mailMessage.WriteTo(emlStream);
            emlStream.Position = 0; // 重置流指针到起始位置

            // 返回EML文件,指定MIME类型为message/rfc822
            return File(emlStream, "message/rfc822", "email-with-attachment.eml");
        }
    }
}

关键代码说明

  • MailMessage类:.NET内置的邮件处理类,自动封装符合标准的MIME格式,包括附件的编码和头信息,无需手动拼接复杂的邮件结构。
  • 附件创建:直接用读取到的文件字节生成附件,确保MIME类型与原文件一致,Outlook能正确识别附件类型(PDF/TIFF/文本等)。
  • WriteTo方法:将MailMessage序列化为标准EML流,避免手动编写MIME头导致的格式错误。
  • 返回类型:指定MIME类型为message/rfc822,浏览器会识别为邮件文件,下载后默认调用系统邮件客户端打开。

前端处理逻辑示例

前端接收后端返回的Blob后,创建下载链接触发下载:

async function downloadEmailAttachment(fileId) {
    try {
        const response = await fetch(`/api/generate-email-attachment?id=${fileId}`);
        if (!response.ok) throw new Error('生成邮件文件失败');
        
        const blob = await response.blob();
        const url = URL.createObjectURL(blob);
        const downloadLink = document.createElement('a');
        
        downloadLink.href = url;
        downloadLink.download = 'email-with-attachment.eml';
        document.body.appendChild(downloadLink);
        downloadLink.click();
        
        document.body.removeChild(downloadLink);
        URL.revokeObjectURL(url);
    } catch (err) {
        console.error(err);
        alert('下载邮件文件失败');
    }
}

注意事项

  • 确保后端服务有权限读取fileDetail.Path指向的文件路径,避免IO权限异常。
  • 若需添加多个附件,重复调用mailMessage.Attachments.Add()添加更多Attachment实例即可。
  • 后续若需要填充收件人、主题等信息,直接设置mailMessage.To、mailMessage.Subject等属性,EML会自动包含这些内容。

内容的提问来源于stack exchange,提问作者It's Siddiqi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:37:47