如何使用C#中的EWS从Exchange获取HTML和文本格式的电子邮件正文?

如何使用C#中的EWS从Exchange获取HTML和文本格式的电子邮件正文?,c#,exchangewebservices,C#,Exchangewebservices,我有一个使用EWS从exchange读取电子邮件的应用程序。我的问题是,获取电子邮件的HTML版本是一个调用,而获取电子邮件的文本版本是另一个调用 有没有一种没有第三方控件的方法可以在一次调用中获得两种格式 如果有一些示例代码就太好了。请在Exchange Server开发论坛上查看此线程,我认为它将回答您的问题 更新 我尝试过这个,所以我可以提供一个代码示例,结果证明您不必使用扩展属性。默认情况下,EWS在EmailMessageSchema.body中返回HTML格式的正文-因此,如果您创

我有一个使用EWS从exchange读取电子邮件的应用程序。我的问题是,获取电子邮件的HTML版本是一个调用,而获取电子邮件的文本版本是另一个调用

有没有一种没有第三方控件的方法可以在一次调用中获得两种格式


如果有一些示例代码就太好了。

请在Exchange Server开发论坛上查看此线程,我认为它将回答您的问题


更新

我尝试过这个,所以我可以提供一个代码示例,结果证明您不必使用扩展属性。默认情况下,EWS在EmailMessageSchema.body中返回HTML格式的正文-因此,如果您创建一个属性集以同时包含ItemSchema.TextBody和EmailMessageSchema.body,您可以在一个绑定调用中获得这两种类型

public static void GetEmail(ExchangeService service, ItemId ItemId)
{
    PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.TextBody, EmailMessageSchema.Body);
    EmailMessage message = EmailMessage.Bind(service, ItemId, propSet);
}
这将导致以下XML请求:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
  <t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
  <m:GetItem>
    <m:ItemShape>
      <t:BaseShape>IdOnly</t:BaseShape>
      <t:AdditionalProperties>
        <t:FieldURI FieldURI="item:TextBody" />
        <t:FieldURI FieldURI="item:Body" />
      </t:AdditionalProperties>
    </m:ItemShape>
    <m:ItemIds>
      <t:ItemId Id="AAMkADE4..." />
    </m:ItemIds>
  </m:GetItem>
</soap:Body>

我只

以及以下回应:

<?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
      <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="878" MinorBuildNumber="11" Version="V2_10" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
    <m:ResponseMessages>
      <m:GetItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:Items>
          <t:Message>
            <t:ItemId Id="AAMkADE4..." ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAGTja3C" />
            <t:Body BodyType="HTML" IsTruncated="false">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD  
                HTML 4.0 Transitional//EN"&gt;
                &lt;html&gt;
                &lt;head&gt;
                &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
               (Removed the rest of my HTML body)
            </t:Body>
            <t:TextBody BodyType="Text" IsTruncated="false">
             (Removed my text body)
            </t:TextBody>
          </t:Message>
        </m:Items>
      </m:GetItemResponseMessage>
    </m:ResponseMessages>
  </m:GetItemResponse>
</s:Body>

无误
!DOCTYPE HTML PUBLIC“-//W3C//DTD
HTML 4.0过渡版//EN“
html
头
meta http equiv=“Content Type”Content=“text/html;charset=utf-8”
(已删除HTML正文的其余部分)
(已删除我的正文)

希望有帮助!
Mimi

除了获取HTML,然后通过某种方法将元素剥离为文本之外,我不知道还有什么其他方法。您好,FreeRangeEggs,这种方法的问题对性能不好,如果您可以在一次通话中同时要求这两件事,您可以提供更好的最终用户体验。完全同意,但是我不认为有任何其他的选择,除非你想打两个电话。谢谢你的回复,但我已经阅读了那篇文章,在它提到extender属性之前,但仍然不清楚如何从扩展属性读取它,这是我的问题。嗨,咪咪,请原谅我的无知,这意味着在C代码中获取它将类似于:
字符串txtBody=message.TextBody;string htmlBody=message.Body
像这样吗?另一个问题是,Mimi该选项仅适用于Exchange 2013,那么Exchange 2010 SP 2如何做到这一点呢?@JulValencia-我相信在Exchange 2013之前,您需要使用外观凌乱的扩展属性,或者需要向Exchange打两个电话,将RequestedBodyType设置为不同的类型。如果电子邮件正文为HTML格式,则只有Exchange 2013及更高版本才支持在返回的XML中提供
BodyType=“Text”
元素的
ItemSchema.TextBody
选项。如果您在Exchange 2010中尝试此操作,将得到ServiceResponseException。