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

将不同的MIME部分映射到 AlternateView LinkedResource Attachment 的最佳方法是什么?

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

有帮助吗?

解决方案 3

现在,我正在使用 Content-Disposition 复制任何不是 inline ,或者使用除Text或Image之外的任何类型的MIME类别来复制任何内容一个附件,任何 inline ,或任何MIME类别 Image 到HTML视图上的 LinkedResource 或最后一个视图,以及其他任何作为 AlternateView 的视图。 (我还没有测试过这个)

其他提示

从10,000英尺的概述,这是我要做的。

将你的哑剧部分展平成树。确保每个部分包含1个,只包含1个部分(不是像多部分/相关的父类,或类似的东西)。

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

    1. 如果第一部分是HTML,请将其设置为消息正文

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

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

  2. 循环通过其余部分。将其他所有内容添加为附件,但

    除外
    1. 具有content-id标头集的图片,或

    2. 设置了内容位置标头的图片。

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

  3. 这应该让你开始,并覆盖大约99%的正常电子邮件。

将多部分/替代部件中包含的任何文本部分(text / plain,text / html等)映射到AlternateView。同时将遇到的第一个文本部分映射到AlternateView,而不管其父类型如何,以满足仅由单个文本部分组成的消息的情况。

将其余部分映射到Attachment或LinkedResource,具体取决于Content-Disposition标头。

将具有附件内容处理的部分映射到附件。

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

可能不是最好的方式,但我会尝试获取“原始”电子邮件,只需用新电子邮件替换为“

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top