Я работаю с Exchange 2010 (а не с Exchange 2013, который позволяет вызывающему пользователю запрашивать как текстовые, так и HTML-объекты напрямую).В EWS, как получить текстовые и текстовые объекты сообщения как строки, сохраняющие исходную кодировку символов
Чтобы получить 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, либо найти другой способ ее извлечения из сообщения. Конечно, я мог бы сделать отдельный запрос к настройке EWS RequestedBodyType = BodyType.HTML, но лучше не делать дополнительный запрос. Я думал, что свойство PR_INTERNET_CPID MAPI (0x3FDE) будет соответствовать моим потребностям, но оно никогда не заполняется (я дважды проверял, что он существует на почтовом сервере, но я не могу получить его через EWS).
Поэтому мне нужно либо убедить библиотеку управляемого EWS, чтобы вернуть как текст HTML, так и текст в виде строк или получить значение PR_INTERNET_CPID. Что я могу сделать для этого?