我有MIME格式的文件。我需要保存这些文件中的附件。不涉及电子邮件。我可以找到很多关于如何将附件添加到电子邮件或MIME文件的示例,但很少有关于如何将它们删除的示例。我看过几个MIME解析器,比如LimiLabs和一个来自SASA。但他们没有展示我正在寻找的样品。我是一个初学者,他们从他们拥有的小文档中了解它们。那么,这甚至可能吗?我是否需要使用第三方项目,还是只能用.NET完成?
MIME-Version: 1.0
Content-Type: multipart/related;boundary="IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:"
--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:
Content-type: text/xml; charset="UTF-8"
Content-id: ACCOUNT
<?xml version="1.0" encoding="utf-8"?>
<ACCOUNT>
<CustId>
<CustPermId>ivan</CustPermId>
<CustLoginId>smaher</CustLoginId>
</CustId>
</ACCOUNT>
--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:
Content-type: image/jpeg
Content-id: CLOCK.JPG
Content-description: Notice of Cancellation
[Base64 Encoded Data Here]
--IGi2rPe3RHug37'6b21FU)yg.3tkE/l5r0e-l+ZXD8qh,-P:--
答案 0 :(得分:1)
我不知道.NET Framework中有任何内置的MIME解析器,您必须使用第三方组件或使用CDOSYS(Microsoft CDO for Windows 2000)。后者是一个COM组件附带的任何Windows版本比Windows 2000更新。这是一个旧的东西,所以依赖它不是完全面向未来的,但它现在可用,它的工作原理。
要使用CDOSYS,只需向此库和ADODB添加COM引用,并使用以下代码加载和解析电子邮件:
CDO.Message msg = new CDO.Message();
// load MIME into CDO
using (FileStream stream = new FileStream(emailFileSpec, FileMode.Open))
{
// read file into a byte stream
byte[] emailData = new byte[stream.Length];
stream.Read(emailData, 0, (int)stream.Length);
// load byte stream data into an ADODB stream for CDO
ADODB.Stream stm = new ADODB.Stream();
stm.Open(
System.Reflection.Missing.Value,
ADODB.ConnectModeEnum.adModeUnknown,
ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified,
null, null);
stm.Type = ADODB.StreamTypeEnum.adTypeBinary;
stm.Write(emailData);
stm.Flush();
stm.SetEOS();
// attach data source to the CDO object
msg.DataSource.OpenObject(stm, "_Stream");
stm.Close();
}
这只是一个示例,可以使用File.ReadAllBytes()
简化代码。
加载电子邮件后,您可以通过IMessage interface的Attachment
属性(即CDO.Message)访问附件。每个附件都是实现IBodyPart接口的对象。使用GetDecodedContentStream()方法将解码后的内容加载到ADODB.Stream中,您可以将其读入.NET字节数组。例如:
// get decoded data into an ADODB stream
ADODB.Stream stm = part.GetDecodedContentStream();
// cast to COM IStream and load into byte array
IStream comStream = (IStream)stm;
byte[] attachmentData = new byte[stm.Size];
comStream.Read(attachmentData, stm.Size, IntPtr.Zero);
HTH。