Attachment.PropertyAccessor.GetProperty для PR_ATTACH_DATA_BIN возвращает массив байтов со всеми элементами 0

У меня есть надстройка Outlook, созданная для отправки больших файловых вложений. Когда пользователь пытается прикрепить файл, он фактически присоединяет файл-заполнитель «.txt», содержимое которого является путем к фактическому вложению. Когда пользователь отправляет электронное письмо, надстройка пытается прочитать содержимое вложения-заполнителя, чтобы получить путь к фактическому вложению. Это делается с помощью метода Attachment.PropertyAccessor.GetProperty при передаче значения "http://schemas.microsoft.com/mapi/proptag/0x37010102" (PR_ATTACH_DATA_BIN).

byte[] attachmentData = attachment.PropertyAccessor.GetProperty(
  "http://schemas.microsoft.com/mapi/proptag/0x37010102");

Это работало несколько лет, и я не обновлял свою надстройку 4 месяца, но с сегодняшнего дня она работает по-другому. Теперь возвращаемое значение для этого метода возвращает массив байтов правильной длины (в моем случае 93 для 93-байтового файла-заполнителя), но все элементы в массиве байтов равны 0. Если я открою файл-заполнитель, все содержимое выглядишь правильно, поэтому я не понимаю, в чем проблема. В настоящее время мы используем последнюю сборку Outlook 2016 (версия 1711, сборка 8730.2127), и я даже пытался вернуться к последним 2 сборкам, но проблема все еще возникает.

Кто-нибудь знает, изменилось ли что-то в Outlook 2016 в отношении MAPI?

Примечание. Я пытался использовать OutlookSpy, чтобы узнать, что происходит, но на вкладке GetAttachmentTable нет записей, хотя из пользовательского интерфейса Outlook я ясно вижу, что есть вложение.


person skeletank    schedule 18.12.2017    source источник


Ответы (2)


У меня не было проблем со следующим скриптом, выполняемым из OutlookSpy (нажмите кнопку «Сценарий», вставьте скрипт, нажмите «Выполнить»)

set msg = Application.ActiveExplorer.Selection(1)
set attach = msg.Attachments(1)
set ps = attach.PropertyAccessor
v = ps.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x37010102")
debug.print ps.BinaryToString(v)
person Dmitry Streblechenko    schedule 18.12.2017
comment
Когда я пытаюсь это сделать, я получаю сообщение об ошибке при выполнении сценария: DISP_E_EXCEPTION Индекс массива Microsoft Outlook выходит за границы. Строка 2, столбец 1, поэтому я предполагаю, что он считает, что в коллекции вложений нет элементов. - person skeletank; 18.12.2017
comment
Вы действительно выбрали элемент с вложением, который хотите обработать? - person Dmitry Streblechenko; 18.12.2017
comment
Я запустил его из контекста MailItem вместо Application.ActiveExplorer.Selection(1) и на этот раз получил результат 220 нулей для файла размером 110 байт. - person skeletank; 18.12.2017
comment
Я не могу воспроизвести это, но моя версия Outlook - 8730.2046 - person Dmitry Streblechenko; 18.12.2017
comment
Вы используете Office 365? Я не вижу этой сборки в списке Microsoft: support.office.com/en-us/article/ - person skeletank; 18.12.2017
comment
да. Я обновился до последней версии 16.0.8827.2082, но скрипт все еще работает нормально. - person Dmitry Streblechenko; 18.12.2017

Мне удалось как-то исправить это, сохранив новое электронное письмо после добавления моего вложения, но перед отправкой.

mailItem.Attachments.Add(filePath, OlAttachmentType.olByValue, Type.Missing, Type.Missing);
mailItem.Save();

Я попробовал это, прочитав описание для метод Attachments.Add, о котором говорится в комментариях:

Когда вложение добавляется в коллекцию вложений элемента, свойство Тип вложения всегда будет возвращать olOLE (6), пока элемент не будет сохранен. Чтобы обеспечить согласованные результаты, всегда сохраняйте элемент перед добавлением или удалением объектов в коллекции вложений.

Я попытался сохранить перед добавлением вложения, но это не повлияло. Это заставило меня попробовать сохранить после добавления, и когда я это сделал, я смог получить правильное значение из свойства «PR_ATTACH_DATA_BIN».

person skeletank    schedule 19.12.2017