返回首页

背景
我在去年的一篇文章中,我讨论了如何读取不同的文件夹如收件箱,已发送的邮件等,并也做了一些标准的基础上的搜索。
我以前在这个系列文章包括:{A}
在这一部分,首先,我将讨论从收件箱中阅读邮件的细节,也包括扩展属性背后的奥秘。其要点是:{A3}{A4}{A5}{A6}{A7}{A8}
每一封邮件的类型MessageType或从MessageType继承,所以我们可以从MessageType甚至到日历相关邮件的收件箱中的所有项目。{A9}
要阅读邮件的细节,我们需要使用的GetItem预警系统提供的API,如:

public void GetSignalDetails(ItemIdType p_strItemId)

{

    GetItemType MailId = new GetItemType();

    GetItemResponseType mailResponse;

    string strMsg = string.Empty;



    MailId.ItemIds = new BaseItemIdType[] { idType };

    MailId.ItemShape = new ItemResponseShapeType();

    MailId.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;

    mailResponse = _esb.GetItem(MailId);

    ArrayOfResponseMessagesType arrMail = p_mailResponse.ResponseMessages;

    ResponseMessageType[] responseMessages = arrMail.Items;

    foreach (ResponseMessageType respmsg in responseMessages)

    {

        if (respmsg.ResponseClass == ResponseClassType.Error)

        {

            throw new Exception("Error: " + respmsg.MessageText);

        }

        else if (respmsg.ResponseClass == ResponseClassType.Warning)

        {

            throw new Exception("Error: " + respmsg.MessageText);

        }

        //check to determine whether the response message is correct type 

        if (respmsg is ItemInfoResponseMessageType)

        {

            ItemInfoResponseMessageType createItemResp = 

                     (respmsg as ItemInfoResponseMessageType);

            ArrayOfRealItemsType aorit = createItemResp.Items;

            foreach (MessageType myitem in aorit.Items)

            {

                string  strSubject = myMessage.Subject;

                if (myMessage.From != null)

                {

                       string strFrom = myMessage.From.Item.Name;

                }

                StringBuilder objTo = new StringBuilder();



                if (myMessage.ToRecipients != null)

                {

                    //To be checked only for single recipient

                    foreach (EmailAddressType email in myMessage.ToRecipients)

                    {

                        objTo.Append(email.Name + "[" + email.EmailAddress + "];");





                    }

                }

                StringBuilder objCC = new StringBuilder();



                if (myMessage.CcRecipients != null)

                {

                    //To be checked only for single recipient

                    foreach (EmailAddressType email in myMessage.CcRecipients)

                    {

                        objCC.Append(email.Name + "[" + email.EmailAddress + "];");

                    }

                }

                objSignalDetailsRow.MailBody = myMessage.Body.Value;

            }

            //Similarly we can read other properties

        }

以同样的方式,我们可以阅读到日历相关的邮件,将在以后的文章中探讨。{A10}
是一个物业类型MessageType BOOL称为isRead。第一次邮件到收件箱,我们以粗体显示,因为它是还没有看过,但读取邮件时,我们需要设置的属性isRead,为true,以便下一次我们显示正常。成功读取邮件后,我们需要更新这个属性为true。我们有一个API UpdateItem更新任何现有的项目。做到这一点的代码所示:{C}
扩展属性是很重要的,对我们时,我们让自定义的电子邮件应用程序,因为,比方说,在邮件中,我们有MessageType项目中的默认属性,并要一个新的属性,让我们说,分类我们的自定义,应用程序,那么我们就需要使用扩展属性。{A12}
我们可以创建和设置一个新的属性作为扩展属性类的一个实例时(例如,​​设置类的属性时)。
MessageType p_objMessage=new p_objMessage();

p_objMessage.ExtendedProperty = new ExtendedPropertyType[1];





PathToExtendedFieldType pathClassification = new PathToExtendedFieldType();

pathClassification.DistinguishedPropertySetId =



DistinguishedPropertySetType.PublicStrings;

pathClassification.DistinguishedPropertySetIdSpecified = true;

pathClassification.PropertyName = "Classification";

pathClassification.PropertyType = MapiPropertyTypeType.String;

p_objMessage.ExtendedProperty[0] = new ExtendedPropertyType();

p_objMessage.ExtendedProperty[0].ExtendedFieldURI = pathClassification;

p_objMessage.ExtendedProperty[0].Item = msgRow.Classification;

在这里,我创建一个扩展属性quot; Classificationquo​​t; MessageType对象,这应该是在设置该对象的其他属性,创建对象后的时候做。{A13}
我们这里有两种情况:在\阅读完所有的文件夹中的项目进行搜索的时间读它。读在详细阅读的时间。
对于第一种情况:我们首先需要指定我们要读哪个属性:
PathToExtendedFieldType pathClassification = new PathToExtendedFieldType();

pathClassification.DistinguishedPropertySetId = 

          DistinguishedPropertySetType.PublicStrings;

pathClassification.DistinguishedPropertySetIdSpecified = true;

pathClassification.PropertyName = "Clasification";



pathClassification.PropertyType = MapiPropertyTypeType.String;

,但使用此,我们首先需要创建一个对象类型ItemResponseShapeType,如下所示设置BaseShape属性:
ItemResponseShapeType itemProperties = new ItemResponseShapeType();

// Use the Default shape for the response. 

itemProperties.BaseShape = DefaultShapeNamesType.Default;

itemProperties.AdditionalProperties = new BasePathToElementType[]

{ pathClassification };

最后,我们需要设置的findRequest对象,如:
findRequest.ItemShape = itemProperties;

对于第二种情况:我们首先需要阅读使用GetItem细节;然后,我们需要呼吁所有的扩展属性EWS的API,因为一走,我们不能这样做。代码如下所示:
public ExtendedPropertyType[] GetExtendedProperties(ItemIdType itemid)

{

    PathToExtendedFieldType pathClassification = new PathToExtendedFieldType();

    pathClassification.DistinguishedPropertySetId = 

       DistinguishedPropertySetType.PublicStrings;

    pathClassification.DistinguishedPropertySetIdSpecified = true;

    pathClassification.PropertyName = "Classification";

    pathClassification.PropertyType = MapiPropertyTypeType.String;





    GetItemType getExPropertiesRequest = new GetItemType();

    ItemIdType iiItemId = new ItemIdType();

    iiItemId = itemid;



    ItemResponseShapeType getResponseShape = new ItemResponseShapeType();

    getResponseShape.BaseShape = DefaultShapeNamesType.AllProperties;

    getResponseShape.IncludeMimeContent = true;

    getExPropertiesRequest.ItemShape = getResponseShape;



    getExPropertiesRequest.ItemShape.AdditionalProperties = 

                                     new BasePathToElementType[1];

    getExPropertiesRequest.ItemShape.AdditionalProperties[0] = pathClassification;





    getExPropertiesRequest.ItemIds = new ItemIdType[1];

    getExPropertiesRequest.ItemIds[0] = iiItemId;

    getExPropertiesRequest.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;



    GetItemResponseType giResponse = _esb.GetItem(getExPropertiesRequest);

    if (giResponse.ResponseMessages.Items[0].ResponseClass == ResponseClassType.Error)

    {

        throw new Exception("Error: " +

        giResponse.ResponseMessages.Items[0].MessageText);

    }

    else

    {

        ItemInfoResponseMessageType rmResponseMessage = 

             giResponse.ResponseMessages.Items[0] as ItemInfoResponseMessageType;



        if (rmResponseMessage.Items.Items[0].ExtendedProperty != null)

        {

            MessageType message = rmResponseMessage.Items.Items[0] as MessageType;

            return (message.ExtendedProperty);

        }

        else

        {

            return null;

        }

    }

}

注:在这篇文章中,_esb ExchangeService对象,因为在我的系列前面的文章中。
我希望这个系列是为所有那些就预警系统的工作非常有用。建议表示高度赞赏。在接下来的文章中,我将开始探索早期预警系统提供的日历。

回答

评论会员:moila 时间:2011/12/28
HI - 感谢您分享您的知识。我有一个问题,我无法解决。请看到我的代码 - 我根本无法将消息标记为只读后,我通过在收件箱中的新邮件,并将其写入到数据库。我将不胜感激任何帮助。感谢你了!

这里是我的代码:
ExchangeService服务=新ExchangeService(ExchangeVersion.Exchange2007_SP1);

  ; FindItemsResults findResults = service.FindItems(folderId,unreadOnly,itemView)

& #160; PropertySet PS =新PropertySet(BasePropertySet.FirstClassProperties);
  ; ps.RequestedBodyType = BodyType.Text;

  ;的foreach(inboxResults逐项)
&# 160; {
& #160; 项目工作= Item.Bind(服务,item.Id,PS)
}
&# 160; / /我这里有代码,将消息写入到DB
& #160; / /这里是我所需要的代码标记为读
在Exchange上述消息
评论会员:伊沙克 时间:2011/12/28
。你好,我是寻找一种方式从服务器检索邮件分类列表
任何意见如何做到这一点
评论会员:?Brij 时间:2011/12/28
,看看下面的链接
{A14}
干杯!!
Brij
访问我的博客:{A15}

我的最新文章:给它一个视图
{A16}
评论会员:tuningrm 时间:2011/12/28
本文是非常有用的!你救了我很多时间!谢谢Brij。
达里奥从罗马,意大利
评论会员:Brij 时间:2011/12/28
!!达里奥
干杯!!
Brij
访问我的博客:{A15}

{A18}
评论会员:zayar_min 时间:2011/12/28
您好Brij,
请意见的SetReadStatus
当我尝试更新的读取状态,我不能更新,响应消息"ChangeKey需要进行此操作。"
esb.UpdateItem UpdateItemResponseType响应=(请求);
"入门EWSProxies.EWS.ResponseCodeType.ErrorChangeKeyRequiredForWriteOperations"
Brgds,
zayar
评论会员:Brij 时间:2011/12/28
在我的文章的功能SetReadStatus中,我传递一个类ItemIdType参数项目,它有两个属性之一是id,另一个是ChangeKey.Whenever我们只想读取从xchamge服务器的任何项目LT; codegt; Idlt; / codegt;是足够的,但如果我们要更新一些项目,以换取我们需要TP提供既LT; codegt; Idlt; / codegt;和LT; codegt; ChangeKeylt; / codegt;这里我们在服务器更新一个项目,我们都需要提供,你可以看到在我的功能,我还提供了为
((ItemIdType)updatedItems [0]条)ID = item.Id;
 60;((ItemIdType)updatedItems [0]条)ChangeKey = item.ChangeKey;

因此,同时提供,它应该工作
干杯!!
Brij
{A19}
评论会员:MrGreene 时间:2011/12/28
Exchange Server可以使用大容量语音邮件和电子邮件进入您的收件箱的UM。
语音邮件具有鲜明的格式,让你做多个事情其中之一是从电子邮件本身distinquish。
我试图从一个单独的服务的语音邮件,并将其发送到Exchange Server。现在,它只是看起来像一个电子邮件。wav文件,当它达到的Outlook附加

作为SMTP邮件附加一个。wav文件,我可以拦截的电子邮件。有没有一种方法然后我可以创建一个消息的数据解析来自,操纵的语音邮件格式,并传送到Exchange Server吗?如果是这样的话,它会再看看,像一个交换语音邮件
评论会员:?Gcawley 时间:2011/12/28
仅供参考,我不得不改变返回值的#2以下。消息总是返回rmResponseMessage数据无关,即使是正确的。
&# 160; 消息= rmResponseMessage.Items.Items [0]作为MessageType;
 0; ExtendedPropertyType [] MyValue = rmResponseMessage.Items.Items [0] ExtendedProperty;
  ; / /返回(message.ExtendedProperty);
返回(MyValue)
评论会员:Brij 时间:2011/12/28
使用rmResponseMessage快速监视,看看所有属性都返回从EWS,你会得到确切的图片
干杯!!
Brij
{A19}
评论会员:NewCoder555 时间:2011/12/28
您好,

我很困惑在什么idtype refres以下。能否请您解释一下在您方便的时候尽早。谢谢!
节的代码,我想知道:

DIM MailID作为新GetItemType()
DIM MailResponse GetItemResponseType
DIM strMsg的String = String.Empty

  ; MailID.ItemIds =新BaseItemIdType(){IdType}

"我得到的错误为IDType,因为它是没有申报
评论会员:。Brij 时间:2011/12/28
在这里,你想一个项目的详细信息。
吧?在EWS中,每个项目确定ItemIdType.You对象的ID必须有一个项目的ID,您要details.So提供的Mail.Cheers ITEMID!
Brij
评论会员:NewCoder555 时间:2011/12/28
您好,

我似乎无法找到在任何地方或在当地的成员设置,它是如何与所有的函数和例程
项目_esb
评论会员:?Brij 时间:2011/12/28
_esb是全局变量,它可以在初始化
constructor.This EWS.Cheers对象!Brij
评论会员:鲁斯兰Guryanov 时间:2011/12/28
想知道,如果有人知道:如何获取或联系人添加到用户的邮箱,使用管理员权限的帐户来访问Exchange 2007中。编码在C#2008

4天的搜索已经不能找到这种解决方案的任何例子。 {S0}
评论会员:vstonape 时间:2011/12/28
喜Brij,

感谢好文章,我有一个关于查询:

我们怎样才能来认识,在收件箱中的特定项目已回复/转发或不?

能否请您把它的一些重点吗?在此先感谢
评论会员:。Brij 时间:2011/12/28
我还没有试过this.there的一些属性,可以用来检查是否有邮件转发或replied.I"会尝试探索,让你知道在themeantime也可以尝试。
一另一种方式,你可以有你自己的扩展属性,保持一个标志whther邮件转发或not.Cheers!
Brij:

| Bhavneet83
评论会员:游客 时间:2011/12/28
我的代码运行,但加载的消息是很慢的
Brij
评论会员:游客 时间:2011/12/28
IR无关与样品的消息codes.Loading是很慢的可能会导致不同的场景,如:您的服务器/机器的速度很慢糟糕的设计您的项目您的网页太重因此,我建议您可以通过以下links.These会帮助你很多的性能。{A21}{A22}另外,请检查您的硬件配置和在机器上运行的所有进程..干杯!!Brij
Ameen阿扎姆汗
评论会员:游客 时间:2011/12/28
thanxbrij真正帮助每一个内容丰富的文章..我在阅读电子邮件的身体有点问题。是有可能只得到文字信息,而不是整个HTML。同时通过循环的电子邮件一段时间,我计划文本和其他时间,我得到的HTML以下是形状的代码,请评论感谢GetItemType要求新GetItemType()ItemResponseShapeTyperesponseShape=新ItemResponseShapeType()responseShape.BodyType=BodyTypeResponseType.Text;responseShape.BaseShape=DefaultShapeNamesType.Default;request.ItemShape=responseShape;////显示身体MessageBox.Show(myitem.Body.Value);关于Ameen阿扎姆
Brij
评论会员:游客 时间:2011/12/28
其实高达发件人,在这种格式中,他/她想要发送的电子邮件,是否文本或html.And邮件正文中包含相同的format.So,它不能接收站点控制这就像你的系统,在这种格式允许发送的电子邮件,如果是,那么你将是相同的两种格式,你可以限制你的应用程序只发送文本格式的邮件。希望它帮助干杯!!Brij
会员2935228
评论会员:游客 时间:2011/12/28
你说你有更新的文章。但是当我点击链接说文章没有找到。如果你有正确的链接,您可以发送给我。感谢修改日(星期四),2009年10月15日,17:46
Brij
评论会员:游客 时间:2011/12/28
你说哪个环节about.Can你给我的文章的名称干杯!!Brij
会员2935228
评论会员:游客 时间:2011/12/28
感谢您的答复。imgsrc=http://www.orcode.com/upimg/2011_12_28_05_05_18_1.gif文章的名称是"编程通过ExchangeServer2007"。当我尝试运行此代码,我得到的错误。-什么是在GetSignalDetails函数idType吗?-你在哪里初始化myMessage变量?-是什么objSignalDetailsRow(INIT,类型)?-读者理解为什么要通过心灵感应你的错误处理没有您的意见?-"messagetype"在您的代码在原MessageType
Yogesh Deshpande说
评论会员:游客 时间:2011/12/28
您好,?一是优秀的文章。我的问题是做Web服务有什么方法让我保存味精格式检索的电子邮件或日历项目。类似Outlook没有什么?,Yogesh