私は Exchange 2010 を使用しています (発信者がプレーンテキストと HTML の両方の本文を直接要求できる Exchange 2013 ではありません)。
HTML 本文を取得するには、次のようなものを使用しています。
ExtendedPropertyDefinition PR_BODY_HTML = new ExtendedPropertyDefinition(0x1013, MapiPropertyType.Binary);
ExtendedPropertyDefinition PR_INTERNET_CPID = new ExtendedPropertyDefinition(0x3FDE, MapiPropertyType.Long);
PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties);
properties.RequestedBodyType = BodyType.Text;
properties.Add(EmailMessageSchema.Body);
properties.Add(PR_BODY_HTML);
properties.Add(PR_INTERNET_CPID);
...
byte[] htmlBodyBytes;
string htmlBody;
int iCP;
if (item.TryGetProperty<int>(PR_INTERNET_CPID, out iCP))
{
// The code never enters here
}
if (item.TryGetProperty<byte[]>(PR_BODY_HTML, out htmlBodyBytes))
{
htmlBody = Encoding.GetEncoding(65001).GetString(htmlBodyBytes);
}
string textBody = item.Body.Text;
プレーンテキストの本文の場合、正しい文字列表現が得られます。しかし、HTML の本文ではバイトしか返されず、GetString に渡すコードページがわかりません。現在、UTF-8 のコードページはハードコードされていますが、これは本番環境では機能しません。HTML 部分のコードページを見つけるか、メッセージからそれを抽出する別の方法を見つける必要があります。もちろん、RequestedBodyType = BodyType.HTML を設定する EWS に対して別のクエリを作成することもできますが、追加のクエリは作成しない方がよいでしょう。PR_INTERNET_CPID MAPI プロパティ (0x3FDE) が私のニーズに合うと思っていましたが、入力されていません (メール サーバーに存在することを再確認しましたが、EWS 経由では取得できません)。
そのため、Managed EWS ライブラリに HTML とプレーンテキストの両方を文字列として返すよう説得するか、PR_INTERNET_CPID 値を取得する必要があります。そのために何ができますか?