Hard to believe, but after almost a week of fighting with this, I finally figured it out. Tested only on Exchange 2007.
Note that this only works if you set every single extended property like in this example and do not use Contact.getEmailAddresses().setEmailAddress().
ExtendedPropertyDefinition propDef_PidLidEmail1DisplayName = new ExtendedPropertyDefinition(//
UUID.fromString("00062004-0000-0000-C000-000000000046"), 0x8080, MapiPropertyType.String);
ExtendedPropertyDefinition propDef_PidLidEmail1AddressType = new ExtendedPropertyDefinition(//
UUID.fromString("00062004-0000-0000-C000-000000000046"), 0x8082, MapiPropertyType.String);
ExtendedPropertyDefinition propDef_PidLidEmail1EmailAddress = new ExtendedPropertyDefinition(//
UUID.fromString("00062004-0000-0000-C000-000000000046"), 0x8083, MapiPropertyType.String);
ExtendedPropertyDefinition propDef_PidLidEmail1OriginalDisplayName = new ExtendedPropertyDefinition(//
UUID.fromString("00062004-0000-0000-C000-000000000046"), 0x8084, MapiPropertyType.String);
ExtendedPropertyDefinition propDef_PidLidEmail1OriginalEntryId = new ExtendedPropertyDefinition(//
UUID.fromString("00062004-0000-0000-C000-000000000046"), 0x8085, MapiPropertyType.Binary);
ExchangeService mailbox = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
mailbox.setUrl(new URL("https://remote.domain.com/EWS/exchange.asmx").toURI());
ExchangeCredentials credentials = new WebCredentials("user.name", "pw", "domain");
mailbox.setCredentials(credentials);
String FIRST = "First";
String LAST = "Last";
String FIRST_LAST = FIRST + " " + LAST; // "First Last"
String EMAIL = "first.last@email.com";
String DISPLAY_NAME = FIRST + " " + LAST + " (" + EMAIL + ")"; // "First Last (first.last@email.com)"
Contact c = new Contact(mailbox);
c.setGivenName(FIRST);
c.setSurname(LAST);
c.setFileAs(FIRST_LAST);
// don't use this
// c.getEmailAddresses().setEmailAddress(EmailAddressKey.EmailAddress1, new EmailAddress(EMAIL));
// Address book Name (seem to trigger the whole address book functionality)
c.setSubject(FIRST_LAST);
// Address book email address
c.setExtendedProperty(propDef_PidLidEmail1OriginalDisplayName, EMAIL);
// contact and address book display name
c.setExtendedProperty(propDef_PidLidEmail1DisplayName, DISPLAY_NAME);
c.setExtendedProperty(propDef_PidLidEmail1AddressType, "SMTP"); // constant
c.setExtendedProperty(propDef_PidLidEmail1EmailAddress, EMAIL);
// not needed after all, exchange sets this automatically
// c.setExtendedProperty(propDef_PidLidEmail1OriginalEntryId, ???);
c.save(WellKnownFolderName.Contacts);
for(Item item : mailbox.findItems(WellKnownFolderName.Contacts, new ItemView(1000)))
{
Contact result = (Contact) item;
PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties);
propertySet.add(propDef_PidLidEmail1AddressType);
propertySet.add(propDef_PidLidEmail1EmailAddress);
propertySet.add(propDef_PidLidEmail1OriginalDisplayName);
propertySet.add(propDef_PidLidEmail1DisplayName);
propertySet.add(propDef_PidLidEmail1OriginalEntryId);
result = Contact.bind(mailbox, result.getId(), propertySet);
LOGGER.info("count: " + result.getExtendedProperties().getCount());
for(ExtendedProperty p : result.getExtendedProperties())
{
LOGGER.info(p.toString());
}
}