MimeKit 将附件添加到从 mht 文件加载的消息中

2024-03-11

您好,我们正在尝试使用 MailKit 开发邮件发送系统。我们有一组使用 WORD 创建并保存为 MHTML 文件的电子邮件模板。当我们使用 MailKit 从 MHT 文件创建 MimeMessage 时,整个事情工作正常。

但是在创建此消息后,我无法找到添加附件的方法。

目前我们正在尝试以下措施。

private void SendEmail(string templatePath, List<string> attachments)
    {
        // Load the MHT Template
        var mimeMessage = MimeMessage.Load(templatePath);

        mimeMessage.From.Add(new MailBoxAddress("[email protected] /cdn-cgi/l/email-protection"));
        mimeMessage.To.Add(new MailBoxAddress("[email protected] /cdn-cgi/l/email-protection"));

        foreach (var attachment in attachments)
        {
            var fileAttachment = new MimePart()
            {
                ContentObject = new ContentObject(File.OpenRead(Path.Combine(attachment), ContentEncoding.Default),
                ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
                ContentTransferEncoding = ContentEncoding.Binary,
                FileName = Path.GetFileName(attachment)
            };

            // Attachments is a read only Enumerable here.
            mimeMessage.Attachments.Add
        }

    }

您需要遍历消息的 MIME 树结构,直到找到Multipart您想要添加“附件”,然后使用 Multipart.Add() 方法。

请记住,消息是嵌套的树结构,而不是只有 1 个消息正文(甚至只有 2 个)和附件列表的明确定义的结构。它比这复杂得多,所以 MimeMessage.Attachments 实际上没有办法“做正确的事情”。

对于一般情况,您可能可以这样做:

var message = MimeMessage.Load(fileName);
var attachment = new MimePart("application", "octet-stream") {
    FileName = attachmentName,
    ContentTransferEncoding = ContentEncoding.Base64,
    Content = new MimeContent(attachmentStream)
};

if (!(message.Body is Multipart multipart &&
      multipart.ContentType.Matches("multipart", "mixed"))) {
    // The top-level MIME part is not a multipart/mixed.
    //
    // Attachments are typically added to a multipart/mixed
    // container which tends to be the top-level MIME part
    // of the message (unless it is signed or encrypted).
    //
    // If the message is signed or encrypted, though, we do
    // do not want to mess with the structure, so the correct
    // thing to do there is to encapsulate the top-level part
    // in a multipart/mixed just like we are going to do anyway.
    multipart = new Multipart("mixed");

    // Replace the message body with the multipart/mixed and
    // add the old message body to it.
    multipart.Add(message.Body);
    message.Body = multipart;
}

// Add the attachment.
multipart.Add(attachment);

// Save the message back out to disk.
message.WriteTo(newFileName);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MimeKit 将附件添加到从 mht 文件加载的消息中 的相关文章

  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 我们可以使用 EWS 托管 API 连接到 Exchange 2016 吗?

    我使用的是 EWS 托管 API 2 2 它的枚举中没有显示 Exchange 版本 2016 我可以看到 Exchange 2013 之前的版本 那么如何连接到 Exchange Server 2016 该 API 是否尚未从 Micro
  • 将非算术类型作为参数传递给 cmath 函数是否有效?

    给定以下用户定义类型S具有转换功能double struct S operator double return 1 0 以及以下调用cmath http en cppreference com w cpp header cmath使用类型的
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐

  • SQL 数据读取器 - 处理空列值

    我正在使用 SQLdatareader 从数据库构建 POCO 除非在数据库中遇到空值 否则该代码将正常工作 例如 如果数据库中的 FirstName 列包含空值 则会引发异常 employee FirstName sqlreader Ge
  • 部署网站时缺少 using 指令或程序集引用错误

    我有一个网站 其中 cs 文件位于 App Code 文件夹中 在我的项目中添加类项时 VS2010 建议我创建此文件夹 我有一个使用此类的 default aspx cs 文件 我在VS2010上运行没有任何错误 但是 当我通过私人托管公
  • 找到重复元素异或运算符数组中的两个非重复元素?

    假设我有一个包含 2n 2 个元素的数组 数组中的 n 个元素出现了两次 其余两个元素是唯一的 你必须在 O n 时间和 O 1 空间内解决这个问题 解决方案之一是使用 XOR 但我无法理解这一点 任何人都可以帮助我解决这个问题或者可以给我
  • 更改声音文件的速度

    我正在寻找改变声音文件的速度 但不知道如何实现它 我假设在减慢速度的情况下必须进行某种类型的插值 但不确定如何实现加速 也许是几个样本的平均值 无论是改变节奏还是音调 目前并不重要 我想学习如何实现这两者 但至少想先完成其中一个 如果有人对
  • 如何更改32位寄存器的特定位而不更改其他位?

    我想直接使用寄存器的物理地址来操作寄存器的某些位 但是我找不到方法来做到这一点 我看到一些关于设置位掩码的帖子 但我发现它们太令人困惑了 我的寄存器物理地址是 0x4A10005C 我想操纵它的 18 16 位之间的位 我想设置0x3在那些
  • 这个模板语法“typename = T”是什么意思?

    有时我会看到这样的语法 template
  • 如何使用 PAC(代理自动配置)通过 Fiddler 调试 Htmlunit 流量

    我有一个使用 Htmlunit 的应用程序 需要放置 Fiddler 来拦截流量 我读了一些有关通过附带的 PAC 代理自动配置 javascript 文件配置它的内容 但我无法再次找到该文章 如何通过 PAC 配置 Htmlunit PA
  • 为什么声明字符串时不需要分配内存[重复]

    这个问题在这里已经有答案了 我是 C 新手 目前我正在尝试了解指针是如何工作的 这是一个让我困惑的问题 据我所知 在给指针赋值之前 应该为该指针分配一定的内存 如果我错了 请纠正我 如下面的代码 int main void int i in
  • 从 Haskell 列表中删除重复元素

    我是 Haskell 的初学者 我只是想知道如何实现一个函数来从数组中删除重复元素 例如 1 1 1 3 4 2 2 3 结果应为 1 3 4 2 我不想使用一些现有的函数 例如 element 并通过使用递归来实现它 我的想法是比较 x
  • 调暗屏幕的正确方法是什么?

    到目前为止 我在搜索中看到了两种方法 这两种方法我都遇到了麻烦 方法一 Settings System putInt getContentResolver Settings System SCREEN BRIGHTNESS 100 方法2
  • 我应该使用 ASP.NET 会话还是避免使用它们,为什么?

    我应该使用 ASP NET 会话还是避免使用它们 为什么 对于新的应用程序 我试着避开他们 https stackoverflow com questions 526697 upgrade from net 3 0 to 3 5 sites
  • DirectX 与 VB.NET

    是否有一组有关 DirectX 9 或更高版本 的文档 其中显示了将 DirectX 9 或更高版本 与 VB NET 一起使用的对象 方法 属性 事件和示例代码 最新的 SDK 包含 C 的详细信息 而 Windows DiectX 图形
  • 无需任何代码即可在 xml 文件中定义 Tabhost/TabWidget + 内容 - 这可能吗?

    是否可以仅在布局 xml 文件中定义选项卡布局 每次我找到 tabhost 教程时 它都只能与一些额外的 java 代码一起使用 这是我的 test xml 它不显示任何选项卡
  • 创建一个可变的 java.lang.String

    众所周知 JavaStrings 是不可变的 自 java 诞生以来 不可变字符串就是它的一个重要补充 不变性允许快速访问和大量优化 与 C 样式字符串相比 显着减少出错的可能性 并有助于实施安全模型 可以在不使用 hack 的情况下创建一
  • sqlalchemy 唯一约束 VS 索引(unique=True)

    我正在使用 MySQL 运行 InnoDB 并使用 sqlalchemy 包装整个内容 现在 我想使用 请参阅docs http sqlalchemy utils readthedocs io en latest database help
  • 将分层 xml 绑定到树视图

    我有一个标准的 NET 3 5 winforms 项目 在它上面 它有一个树视图 我已使用 XmlSerializer 和相关类将 List 实例序列化为 XML 以获得分层 XML 文件 现在 我需要将此 XML 文件绑定到树视图以显示其
  • 使用两个掩码更新数组值 a[mask1][mask2]=value

    给定一个数组和一个掩码 我们可以将新值分配给掩码中为 TRUE 的位置 import numpy as np a np array 1 2 3 4 5 6 mask1 a 2 a 5 a mask1 100 print a 1 100 3
  • 模拟器可以播放什么格式的视频?

    Android模拟器支持哪些格式的视频文件 我知道它可能不会实时播放 但是哪些会实时播放 秘密在于模拟器将播放 MP4 基线配置文件 而真实设备也将播放更好的 MP4 配置文件 为了获得在模拟器中正常播放的视频文件 请尝试以下设置 ffmp
  • 创建下载加速器

    我指的是本文 http www geekpedia com tutorial179 Creating a download manager in Csharp html了解使用 C 下载文件 代码使用传统方法读取Stream就像 bytes
  • MimeKit 将附件添加到从 mht 文件加载的消息中

    您好 我们正在尝试使用 MailKit 开发邮件发送系统 我们有一组使用 WORD 创建并保存为 MHTML 文件的电子邮件模板 当我们使用 MailKit 从 MHT 文件创建 MimeMessage 时 整个事情工作正常 但是在创建此消