3

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

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

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

4

5 回答 5

2

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

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

  1. 检查身体的以下情况:

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

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

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

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

    1. 具有 content-id 标头集的图像,或

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

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

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

于 2009-06-16T14:33:10.490 回答
1

将包含在 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)。

于 2011-01-28T19:16:28.147 回答
0

现在,我正在将任何具有Content-Dispositionwhich is notinline或具有除 Text 或 Image 之外的任何 MIME 类别的任何内容Attachment复制到HTML 视图或最后一个视图inline中具有 MIME 类别的任何内容,以及任何其他作为. (我还没有测试过这个)ImageLinkedResourceAlternateView

于 2009-06-16T11:44:18.193 回答
0

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

于 2009-06-16T11:46:06.303 回答
0

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

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

于 2009-06-17T11:58:07.583 回答