自定义管道组件从POP3交换服务器中提取邮件附件 [英] Custom Pipeline Component to extract mail attachment from POP3 exchange server

查看:69
本文介绍了自定义管道组件从POP3交换服务器中提取邮件附件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我已经实现了管道组件。原始代码有一些错误,并创建了4个文件(3个图像和一个附件)。在稍微操作代码后,我只收到csv文件,但它是一个空白附件。我正在使用BizTalk 2009
服务器进行开发。

I have implemented the pipeline component. The original code had some bugs and was creating 4 files(3 images and one attachment). After manipulating the code little bit now I am receiving only the csv file but it is a blank attachment. I am using BizTalk 2009 server for the development.



下面是我的更新代码:

Below is my updated code:


        public void Disassemble(Microsoft.BizTalk.Component.Interop.IPipelineContext pc,Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)

        {

$
            var partName = string.Empty;



            //我们从索引1开始,因为索引零包含邮件的正文



            //我们不感兴趣的是


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; for(int i = 1; i< inmsg.PartCount; i ++)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; IBaseMessagePart currentPart = inmsg.GetPartByIndex(i,out partName);
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Stream currentPartStream = currentPart.GetOriginalDataStream();
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; var ms = new MemoryStream();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; IBaseMessage outMsg;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg = pc.GetMessageFactory()。CreateMessage();
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(outMsg.Context == null)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.Context = pc.GetMessageFactory()。CreateMessageContext();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.AddPart(" Body",pc.GetMessageFactory()。CreateMessagePart(),true);
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(outMsg.GetPart(" Body")。PartProperties == null)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.GetPart(" Body")。PartProperties = pc.GetMessageFactory()。CreatePropertyBag();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; for(int j = 0; j< inmsg.Context.CountProperties; j ++)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string currentName;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string currentNamespace;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; object objin = inmsg.Context.ReadAt(j,out currentName,out currentNamespace);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.Context.Write(currentName,currentNamespace,objin);
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(inmsg.Context.IsPromoted(currentName,currentNamespace))

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.Context.Promote(currentName,currentNamespace,objin);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; for(int j = 0; j< currentPart.PartProperties.CountProperties; j ++)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string currentName;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string currentNamespace;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; object objin = currentPart.PartProperties.ReadAt(j,out currentName,out currentNamespace);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.GetPart(" Body")。PartProperties.Write(currentName,currentNamespace,objin);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //currentPartStream.CopyTo(ms);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; byte [] buffer = new byte [4096];

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; int bytesRead = 0;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; while((bytesRead = currentPartStream.Read(buffer,0,buffer.Length))!= 0)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; ms.Write(buffer,0,bytesRead);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string attachmentContent = Encoding.Default.GetString(ms.ToArray());

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; MemoryStream attachmentStream = new System.IO.MemoryStream(System.Text.Encoding.Default.GetBytes(attachmentContent));



$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; // string attachmentContent = Encoding.UTF8.GetString(ms.ToArray());

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; // MemoryStream attachmentStream = new System.IO.MemoryStream(

         //System.Text.Encoding.UTF8.GetBytes(attachmentContent) ); $
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.GetPart(" Body")。数据= ms;



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //推广附件文件名



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; outMsg.Context.Write(" ReceivedFileName"," http://schemas.microsoft.com/BizTalk/2003/file-properties" ;, currentPart.PartProperties.Read(" FileName"," http:// schemas .microsoft.com / BizTalk / 2003 / mime-properties"));
$


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; _msgs.Enqueue(outMsg);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; }

        public void Disassemble(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
        {

            var partName = string.Empty;

            // we start from index 1 because index zero contains the body of the message

            // which we are not interested

            for (int i = 1; i < inmsg.PartCount; i++)
            {

                IBaseMessagePart currentPart = inmsg.GetPartByIndex(i, out partName);

                Stream currentPartStream = currentPart.GetOriginalDataStream();

                var ms = new MemoryStream();

                IBaseMessage outMsg;

                outMsg = pc.GetMessageFactory().CreateMessage();

                if (outMsg.Context == null)
                {
                    outMsg.Context = pc.GetMessageFactory().CreateMessageContext();
                }


                outMsg.AddPart("Body", pc.GetMessageFactory().CreateMessagePart(), true);

                if (outMsg.GetPart("Body").PartProperties == null)
                {
                    outMsg.GetPart("Body").PartProperties = pc.GetMessageFactory().CreatePropertyBag();
                }


                for (int j = 0; j < inmsg.Context.CountProperties; j++)
                {

                    string currentName;

                    string currentNamespace;

                    object objin = inmsg.Context.ReadAt(j, out currentName, out currentNamespace);

                    outMsg.Context.Write(currentName, currentNamespace, objin);

                    if (inmsg.Context.IsPromoted(currentName, currentNamespace))
                    {

                        outMsg.Context.Promote(currentName, currentNamespace, objin);

                    }

                }

                for (int j = 0; j < currentPart.PartProperties.CountProperties; j++)
                {

                    string currentName;

                    string currentNamespace;

                    object objin = currentPart.PartProperties.ReadAt(j, out currentName, out currentNamespace);

                    outMsg.GetPart("Body").PartProperties.Write(currentName, currentNamespace, objin);

                }


                //currentPartStream.CopyTo(ms);
                byte[] buffer = new byte[4096];
                int bytesRead = 0;

                while ((bytesRead = currentPartStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    ms.Write(buffer, 0, bytesRead);
                }
                string attachmentContent = Encoding.Default.GetString(ms.ToArray());
                MemoryStream attachmentStream = new System.IO.MemoryStream(System.Text.Encoding.Default.GetBytes(attachmentContent));



                //string attachmentContent = Encoding.UTF8.GetString(ms.ToArray());
                //MemoryStream attachmentStream = new System.IO.MemoryStream(
                //System.Text.Encoding.UTF8.GetBytes(attachmentContent));
                outMsg.GetPart("Body").Data = ms;

                //Promote attachment file name

                outMsg.Context.Write("ReceivedFileName", "http://schemas.microsoft.com/BizTalk/2003/file-properties", currentPart.PartProperties.Read("FileName", "http://schemas.microsoft.com/BizTalk/2003/mime-properties"));

                _msgs.Enqueue(outMsg);

            }

        }



请建议任何更改以使其正常工作。

Please suggest any change to make it work.



提前致谢。

Thanks in advance.




DivyaniSingh

DivyaniSingh

推荐答案

你需要回放你的流。

You need to rewind your stream.

ms.Flush();
ms.Position = 0;


这篇关于自定义管道组件从POP3交换服务器中提取邮件附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆