首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要有关如何使用C#从MIME文件中获取附件的帮助/建议

需要有关如何使用C#从MIME文件中获取附件的帮助/建议
EN

Stack Overflow用户
提问于 2014-09-15 21:52:42
回答 1查看 960关注 0票数 0

我有MIME格式的文件。我需要保存那些文件中的附件。不涉及电子邮件。我可以找到很多关于如何在电子邮件或MIME文件中添加附件的例子,但是很少有关于如何将它们删除的例子。我看过几个MIME解析器,比如LimiLabs,还有一个来自SASA。但他们不给我拿样品。我是个新手,从他们所拥有的很少的文档中,我无法理解他们。这有可能吗?我是否需要使用第三方项目,还是只使用.NET?

代码语言:javascript
复制
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:--
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-17 07:50:07

我不知道.NET框架中有任何内置的MIME解析器,您必须要么使用第三方组件,要么使用CDOSYS (MicrosoftCDOforWindows2000)。后者是随Windows 2000更新的任何Windows版本附带的COM组件。这是一件老生常谈的事,所以依赖它并不完全是未来的证据,但它现在是可用的,而且很有效。

要使用CDOSYS,只需向该库和ADODB添加一个COM引用,并使用以下代码加载和解析电子邮件:

代码语言:javascript
复制
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接口IMessage接口属性(即CDO.Message)访问附件。每个附件都是一个实现IBodyPart接口的对象。使用GetDecodedContentStream()方法将解码后的内容加载到ADODB.Stream中,您可以将其读入.NET字节数组。示例:

代码语言:javascript
复制
// 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25857503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档