Поделиться через


Поток автозаполнения

Относится к: Outlook 2013 | Outlook 2016

Необходимо понимать не только то, как Microsoft Outlook взаимодействует с потоком автозаполнения, но и двоичный формат потока автозаполнения.

Поток автозаполнения — это набор строк свойств получателя, который сохраняется в виде двоичного потока вместе с некоторыми метаданными, которые используются только Microsoft Outlook 2013, Microsoft Outlook 2010, Microsoft Office Outlook 2007 и Microsoft Outlook 2003. Метаданные относятся к взаимодействиям Outlook с потоком автозаполнения, поэтому третьим сторонам необходимо сохранять содержимое каждого блока метаданных при сохранении измененного потока автозаполнения. Иными словами, третьим сторонам следует изменить только часть с набором строк двоичного формата и сохранить изначальное содержимое блока метаданных для потока автозаполнения.

Визуализация потока

Высокоуровневая структура потока автозаполнения выглядит следующим образом:

метаданные (4 байта);

основной номер версии (4 байта);

дополнительный номер версии (4 байта);

количество строк n (4 байта);

количество свойств p в первой строке (4 байта);

тег свойства 1 (4 байта);

зарезервированные данные свойства 1 (4 байта);

объединение значений для свойства 1 (8 байтов);

данные значения свойства 1 (байты переменной или 0);

… свойства (от свойства 2 до свойства P-1);

тег свойства p (4 байта);

зарезервированные данные свойства p (4 байта);

объединение значений для свойства p (8 байтов);

данные значения свойства p (байты переменной или 0);

количество свойств q в строке второй (4 байта);

… свойства строки второй;

… строки (от строки 3 до строки n-1);

количество свойств r в строке n (4 байта);

… свойства строки n;

количество байтов дополнительных сведений EI (4 байта);

дополнительные сведения (байты EI);

метаданные (8 байтов).

Пример двоичной структуры см. в разделе "Binary Example" (Пример двоичной структуры) документа Outlook 2003/2007 NK2 File Format and Developer Guidelines (Рекомендации разработчикам и сведения о формате NK2 файлов Outlook 2003/2007).

Высокоуровневая структура

В целом структура потока автозаполнения выглядит указанным ниже образом.

Данные значения Количество байтов
Метаданные
4
Основной номер версии
4
Дополнительный номер версии
4
Набор строк
Переменная
Количество байтов дополнительных сведений EI
4
Дополнительные сведения
EI
Метаданные
8

Если при чтении потока обнаружено, что основной номер версии отличается от 12, то этот поток не следует читать или же записывать. Текущий дополнительный номер версии потока автозаполнения — 0, то есть количество байтов дополнительной информации равно 0. Если дополнительный номер версии отличается от 0, то будет присутствовать дополнительная информация, которую необходимо прочесть во время чтения потока и сохранить при записывании потока. Кроме того, при записывании потока необходимо будет сохранить дополнительный номер версии. Если не сохранить ни одно из этих значений, данные в записавших дополнительную информацию экземплярах Outlook будут утеряны.

Примечание.

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

Структура набора строк

Структура набора строк выглядит указанным ниже образом.

Данные значения Количество байтов
Количество строк
4
Строки
Переменная

Количество строк определяет, сколько строк попадает в следующую часть последовательности двоичного потока.

Структура строки

Каждая строка имеет указанный ниже формат.

Данные значения Количество байтов
Количество свойств
4
Свойства
Переменная

Количество свойств определяет, сколько свойств попадает в следующую часть последовательности двоичного потока.

Структура свойства

Каждое свойство имеет указанный ниже формат.

Данные значения Количество байтов
Тег свойства
4
Зарезервированные данные
4
Объединение значений свойства
Данные значения
0 или переменная (в зависимости от тега свойства)

Интерпретация значения свойства

Объединение значений свойства и данные значения следует интерпретировать с учетом тега свойства в первых 4 байтах блока свойства. У этого тега свойства такой же формат, как и у тега свойства в MAPI. Биты от 0 до 15 тега свойства соответствуют типу свойства. Биты от 16 до 31 соответствуют идентификатору свойства. Тип свойства определяет, как следует читать остальные данные свойства.

Статическое значение

Некоторые свойства не имеют данных значения, у них есть только данные объединения. Ниже показано, как для типов свойств, которые следуют из тега свойства, должны интерпретироваться 8-байтовые данные объединения свойств.

Тип свойства Интерпретация объединения свойств
PT_I2
short int
PT_LONG
long
PT_ERROR
long
PT_R4
float
PT_DOUBLE
double
PT_BOOLEAN
short int
PT_SYSTIME
FILETIME
PT_I8
LARGE_INTEGER

Динамические значения

Другие свойства содержат данные в блоке данных значения после первых 16 байтов, включающие тег свойства, зарезервированные данные и объединение значений свойства. В отличие от статических значений, данные, которые хранятся в 8-байтовом объединении значений свойства иррелевантны при прочтении. Обеспечьте заполнение 8 байтов данными при записывании. Содержимое этих 8 байтов не имеет значения. В случае динамических значений тип тега свойства определяет, как интерпретировать данные значения.

PT_STRING8

Данные значения Количество байтов
Количество байтов n
4
Байты, интерпретируемые как строка ANSI (включает знак завершения NULL)
n

PT_CLSID

Данные значения Количество байтов
Байты, интерпретируемые как GUID
16

PT_BINARY

Данные значения Количество байтов
Количество байтов n
4
Байты, интерпретируемые как массив байтов
n

PT_MV_BINARY

Данные значения Количество байтов
Количество двоичных массивов X
4
Последовательность байтов, которая содержит двоичные массивы X. Каждый массив следует интерпретировать точно так же, как и последовательность байтов PT_BINARY. Переменная

PT_MV_STRING8 (Outlook 2007, Outlook 2010 и Outlook 2013)

Данные значения Количество байтов
Количество строк ANSI X
4
Последовательность байтов, которая содержит строки ANSI X. Каждую строку нужно интерпретировать точно так же, как и последовательность байтов PT_STRING8. Переменная

PT_MV_UNICODE (Outlook 2007, Outlook 2010, Outlook 2013)

Данные значения Количество байтов
Количество строк Юникода X
4
Последовательность байтов, которая содержит строки Юникода X. Каждую строку нужно интерпретировать точно так же, как и последовательность байтов PT_UNICODE. Переменная

Значительные свойства

Как уже было сказано в этой статье, двоичные блоки, представляющие свойства, имеют теги свойства, которые соответствуют свойствам получателей из адресной книги. Описание тегов, которые не указаны здесь, вы можете найти в статье https://msdn.microsoft.com/library/cc433490(EXCHG.80).aspx.

Имя свойства Тег свойства Описание (дополнительные сведения см. на сайте MSDN)
PR_NICK_NAME_W (не передается получателям, относится только к потоку автозаполнения)
0x6001001f
Это свойство должно быть первым в каждой строке получателей. Функционально является идентификатором ключа строки получателей.
PR_ENTRYID
0x0FFF0102
Идентификатор записи адресной книги для получателя.
PR_DISPLAY_NAME_W
0x3001001F
Отображаемое имя получателя.
PR_EMAIL_ADDRESS_W
0x3003001F
Адрес электронной почты получателя (например johndoe@contoso.com , или /o=Contoso/OU=Foo/cn=Recipients/cn=johndoe)
PR_ADDRTYPE_W
0x3002001F
Тип адреса получателя (например, SMTP или EX).
PR_SEARCH_KEY
0x300B0102
Ключ поиска MAPI получателя.
PR_SMTP_ADDRESS_W
0x39FE001f
SMTP-адрес получателя.
PR_DROPDOWN_DISPLAY_NAME_W (не передается получателям, относится только к потоку автозаполнения)
0X6003001f
Отображаемая строка, которая появляется в списке автозаполнения.
PR_NICK_NAME_WEIGHT (не передается получателям, относится только к потоку автозаполнения)
0x60040003
Вес этой записи автозаполнения. Вес позволяет определить порядок записей автозаполнения при сопоставлении со списком автозаполнения. Записи с большим весом будут отображаться перед записями с меньшим весом. Готовый список автозаполнения сортируется согласно этому свойству. Вес уменьшается с течением времени и увеличивается, когда пользователь отправляет сообщение соответствующему получателю. Дополнительные сведения об этом свойстве см. далее в статье.

PR_NICK_NAME_WEIGHT

Набор строк в потоке автозаполнения сортируется в порядке убывания согласно свойству PR_NICK_NAME_WEIGHT. Эта характеристика сортировки всегда должна сохраняться в потоке автозаполнения. Изменения в весе строки должны обеспечивать соответствие ее позиции порядку сортировки в готовом наборе сток. Возможные дополнительные элементы должны вноситься в наборы строк согласно порядку сортировки.

Минимальное значение веса — 0x1, а максимальное значение — LONG_MAX. Любые другие значения веса считаются недопустимыми.

Когда Outlook 2007 сопоставляет получателя или отправляет ему сообщение, вес этого получателя возрастает на 0x2000.