Quando o aniversário ou aniversário de um item de contato é definido, um item de compromisso é criado automaticamente. Se o contato for removido, esses compromissos não serão. Este artigo Find Outlook AppointmentItem for ContactItem me deu a solução para remover esses compromissos. Isso é ótimo, mas eu quero identificar os compromissos "órfãos" que estavam relacionados a um contato já removido. Olhando para as propriedades de um compromisso de aniversário, encontrei quatro propriedades que armazenam informações de contato.
- Entrada de link de contato PidLid
- PidLidContactLinkNome
- PidLidContactLinkSearchKey
- Contatos PidLid
Usando o appointment.PropertyAccessor, consigo obter um valor para PidLidContactLinkEntry ( http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/85850102 ) e PidLidContactLinkSearchKey.( http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/85840102 ), ambos valores PT_BINARY.
Os outros 2 não são expostos pelo Outlook, ao que parece. PidLidContactLinkEntry está documentado aqui: https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcmsg/305ad82d-f941-4c45-813c-99a8cb5403aa PidLidContactLinkSearchKey está documentado aqui: https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcmsg/85875108-dbb6-4ef7-a7c6-c89e914c1a47
Aqui está minha pergunta: Como obtenho o valor para o nome do contato ou EntryID. Usando os valores de propriedade acima?
Como
PidLidContactLinkEntry
a documentação sugere, você pode analisar o blob e extrair o entryid do contato.Você também pode usar o valor da
PidLidContactLinkSearchKey
propriedade para procurar o contato correspondente na pasta padrão Contacts. Tenha em mente que o OOM não deixaria você procurar pelas propriedades binárias (PT_BINARY); se usar Redemption (eu sou o autor) for uma opção, sua versão permite procurar em propriedades binárias usando uma consulta comoRDOFolder.Items
.Find/Restrict
"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/85840102" = '1234567890ABCDEF'
Observando o valor da string da propriedade e este documento https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcdata/c33d5b9c-d044-4727-96e2-2051f8419ab1 descobri que:
Um entryID de contato deve começar com os sinalizadores 00.00.00.00 (4 bytes) seguidos por provider (16 bytes) FE.42.AA.0A.18.C7.1A.10.E8.85.0B.65.1C.24.00.00. seguido por version (4 bytes) 03.00.00.00 seguido por type (4 bytes) 04.00.00.00 seguido por type Index (4 bytes) 00.00.00.00 seguido por EntryIdCount (4 bytes) 00.00.00.00 seguido por EntryIdBytes (EntryIdCount bytes) os 4 bytes restantes parecem não ser relevantes.
De fato, o valor da string da propriedade inclui esses valores obrigatórios para um entryID de contato e o EntryID que eu estava procurando fica onde deveria estar. Só não vi antes.
Obrigado por me mostrar isso.