2016-11-25 5 views
0

Я работаю с 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. Что я могу сделать для этого?

ответ

1

ОК, выясняется, что PidTagInternetCodepage (PR_INTERNET_CPID) имеет тип MapiPropertyType.Integer, а не MapiPropertyType.Long (хотя MSDN говорит PT_LONG). После настройки я могу получить значение, о котором идет речь, просто отлично.

Смежные вопросы