自定义管道组件从POP3交换服务器中提取邮件附件 [英] Custom Pipeline Component to extract mail attachment from POP3 exchange server
问题描述
我已经实现了管道组件。原始代码有一些错误,并创建了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屋!