我正在编写一个处理和转发电子邮件的C#程序。我有一个POP3库和一个MIME解析器,我需要将MIME树复制到System.Net.Mail.MailMessage
。
将不同的MIME部分映射到AlternateView
,LinkedResource
和Attachment
的最佳方法是什么?
编辑:这适用于所有邮件客户端(发送和接收)
答案 0 :(得分:2)
从10,000英尺的概述,我会做的就是这样。
将你的哑剧部分展平成树。确保每个部分包含1个,只包含1个部分(不是像多部分/相关的父类,或类似的东西)。
检查身体的以下条件:
如果第一部分是HTML,请将其设置为消息正文
如果第一部分是纯文本,第二部分是不是 html,请将纯文本部分设置为邮件正文。
如果第一部分是普通部分,第二部分是html,则创建2个替代视图。 ***这假设这些部分都没有Content-Disposition:附件标题。
循环通过其余部分。将其他所有内容添加为附件,但
除外具有content-id标头集的图片,或
设置了内容位置标头的图片。
如果存在其中一个标题,那么我会将这些图像作为LinkedResource添加(仅当实际存在HTML正文部分时)。
这应该让你开始,并覆盖大约99%的正常电子邮件。
答案 1 :(得分:1)
将多部分/替代部件中包含的任何文本部分(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)。
答案 2 :(得分:0)
现在,我正在复制Content-Disposition
不是inline
,或者将MIME类别除了文字或图片以外的任何内容复制到Attachment
,任何内容inline
,或HTML视图或最后一个视图中MIME类别为Image
到LinkedResource
的任何内容,以及AlternateView
之外的任何内容。 (我还没有测试过这个)
答案 3 :(得分:0)
可能不是最好的方式,但我会尝试获取“原始”电子邮件,只需用新电子邮件替换为“
答案 4 :(得分:0)
System.Net.Mail.MailMessage仅提供MIME提供的一小部分。因此,如果您的MIME解析器旨在支持所有/大多数标准功能,那么将MIME消息复制到MailMessage的目标将是困难的,最坏的情况是不可能的。提供POP3访问的库是否也提供SMTP访问?如果是这样的话,我将单独留下System.Net.Mail.MailMessage,并与第三方库提供的内容一起使用。