【问题标题】:Convert MIME tree to MailMessage将 MIME 树转换为 MailMessage
【发布时间】:2010-11-03 07:27:53
【问题描述】:

我正在编写一个处理和转发电子邮件的 C# 程序。我有一个 POP3 库和一个 MIME 解析器,我需要将 MIME 树复制到 System.Net.Mail.MailMessage

将不同的 MIME 部分映射到 AlternateViews、LinkedResources 和 Attachments 的最佳方法是什么?

编辑:这将适用于所有邮件客户端(发送和接收)

【问题讨论】:

    标签: .net mime mailmessage


    【解决方案1】:

    从 10,000 英尺的全景来看,这就是我要做的。

    将你的 mime 部分展平成一棵树。确保每个部分包含 1 个,并且仅包含 1 个部分(不是像 multipart/related 之类的父级或类似的东西)。

    1. 检查身体的以下条件:

      1. 如果第一部分是HTML,则设置为邮件正文

      2. 如果第一部分是纯文本,第二部分是html,则将纯文本部分设置为邮件正文。

      3. 如果第一部分是纯文本,第二部分是 html,则创建 2 个替代视图。 ***这假设这些部分都没有 Content-Disposition:attachment 标头。

    2. 循环遍历其余部分。将其他所有内容添加为附件,除了

      1. 设置了 content-id 标头的图像,或

      2. 具有内容位置标头集的图像。

        如果存在这些标题之一,那么我会将这些图像作为 LinkedResource 添加(仅当实际上存在 HTML 正文部分时)。

    这应该让您开始,并涵盖大约 99% 的普通电子邮件。

    【讨论】:

      【解决方案2】:

      将包含在 multipart/alternative 部分中的任何文本部分(text/plain、text/html 等)映射到 AlternateView。还将遇到的第一个文本部分映射到 AlternateView,而不管其父类型如何,以适应消息仅包含单个文本部分的情况。

      根据 Content-Disposition 标头将剩余部分映射到 Attachment 或 LinkedResource。

      将那些带有附件 Content-Disposition 的部分映射到附件。

      将那些具有内联 Content-Disposition 或没有 Content-Disposition 标头的部分映射到 LinkedResource。最后一步可以通过检查 Content-ID 是否与从特定文本部分引用的 Content-ID 匹配来解决,但出于实际目的,可以假设以这种方式创建的所有 LinkedResources 都属于第一个 text/html AlternateView (或最后创建的 AlternateView,如果没有 text/html 类型的 AlternateView)。

      【讨论】:

        【解决方案3】:

        嗯,你绝对需要使用 System.Net.Mail.MailMessage 吗?

        System.Net.Mail.MailMessage 仅提供 MIME 提供的一小部分。因此,如果您的 MIME 解析器旨在支持所有/大多数标准功能,那么您将 MIME 消息复制到 MailMessage 中的目标充其量是困难的,而在最坏的情况下是不可能的。提供 POP3 访问的库不也提供 SMTP 访问吗?如果是这样,我会单独留下 System.Net.Mail.MailMessage 并使用第三方库提供的任何内容。

        【讨论】:

          【解决方案4】:

          可能不是最好的方法,但我会尝试获取“原始”电子邮件,然后用新电子邮件替换 to

          【讨论】:

          • SmtpClient 无法发送原始 MIME 源
          • 没错,让它工作(即 tcpclient 到 smpt 发送)或类似的东西会是一个不错的小技巧
          【解决方案5】:

          现在,我正在将带有Content-Disposition(不是inline)或MIME 类别(不是文本或图像)的任何内容复制到Attachment、任何inline 或任何内容在 HTML 视图或最后一个视图上的 MIME 类别为 ImageLinkedResource,以及其他任何内容为 AlternateView。 (我还没有测试过)

          【讨论】:

            猜你喜欢
            • 2011-11-22
            • 1970-01-01
            • 2014-01-01
            • 2018-01-11
            • 2017-10-24
            • 2015-09-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多