В EWS, как получить как текстовые, так и HTML-тексты сообщения в виде строк, сохраняющих исходную кодировку символов
Я работаю с Exchange 2010 (не с Exchange 2013, который позволяет вызывающей стороне запрашивать как текстовые, так и HTML-тела напрямую).
Чтобы получить тело 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, но я бы лучше не делал дополнительный запрос. Я думал, что свойство MAPI PR_INTERNET_CPID (0x3FDE) будет соответствовать моим потребностям, но оно никогда не заполняется (я дважды проверил, что оно существует на почтовом сервере, но я не могу получить его через EWS).
Поэтому мне нужно либо убедить библиотеку Managed EWS вернуть как HTML, так и простой текст в виде строк, или получить значение PR_INTERNET_CPID. Что я могу сделать для этого?
1 ответ
Итак, оказывается, что PidTagInternetCodepage (PR_INTERNET_CPID) имеет тип MapiPropertyType.Integer, а не MapiPropertyType.Long (хотя MSDN говорит PT_LONG). После корректировки я могу получить значение, о котором идет речь, просто отлично.