如何使用EWS Java API(Exchange Web服务)设置联系人Email1DisplayName?

时间:2013-05-21 08:40:55

标签: exchangewebservices ewsjavaapi

我刚想出如何设置标题(参见How to set the contact title using the EWS Java API (Exchange Web Service)?)。现在我正在尝试设置电子邮件1显示名称。

如果我使用公开的API Contact.getEmailAddresses()。setEmailAddress(),则显示名称会自动设置为与电子邮件地址相同(并且它会覆盖我的扩展属性)。

所以现在我试图通过扩展属性设置完整的电子邮件信息。它几乎可以工作,除非我查看地址簿,名称和显示名称都是空的。

我觉得这与Email1OriginalEntryId属性有关,我不知道如何正确设置。

有什么想法吗?

我目前的尝试是这样的:

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);

Contact c = new Contact(mailbox);
c.setGivenName("GivenName");
c.setSurname("Surname");

//    c.getEmailAddresses().setEmailAddress(EmailAddressKey.EmailAddress1, new EmailAddress("AB12@B12.com"));

c.setExtendedProperty(propDef_PidLidEmail1AddressType, "SMTP");
c.setExtendedProperty(propDef_PidLidEmail1EmailAddress, "A12@B12.com");
c.setExtendedProperty(propDef_PidLidEmail1OriginalDisplayName, "A12@B12.com");
c.setExtendedProperty(propDef_PidLidEmail1DisplayName, "A12 B12 (A12@B12.com)");
//    c.setExtendedProperty(propDef_PidLidEmail1OriginalEntryId, ???);

c.save(WellKnownFolderName.Contacts);

enter image description here

1 个答案:

答案 0 :(得分:3)

很难相信,但经过近一周的战斗,我终于明白了。仅在Exchange 2007上测试。

请注意,这仅适用于您在此示例中设置每个扩展属性并且不使用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());
  }
}

enter image description here

enter image description here