CRM 2011 从电子邮件抄送列表中删除 Activity 方

CRM 2011 Removing Activity Party from the Email CC List

如何通过插件从 CRM 2011 的电子邮件抄送字段中删除 Activity 参与方?

到目前为止我已经完成了,但我还没有做到这一点。我的问题是电子邮件路由器在抄送字段中复制了具有相同电子邮件地址的联系人。我们建议删除联系人重复数据是最好的解决方案,但该解决方案尚未被接受。因此,目前,我们需要能够从电子邮件抄送字段中删除 activity 方,并将其替换为未解析的电子邮件地址。

有什么想法吗?

Email email = crmService.Retrieve(Email.EntityLogicalName, emailId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true)).ToEntity<Email>(); //Do not use ColumnSet(true)
List<ActivityParty> ccPartyList = email.Cc.ToList<ActivityParty>();
List<string> ccEmailAddresses = new List<string>();

foreach (ActivityParty ap in ccPartyList)
{
    ccEmailAddresses.Add(ap.AddressUsed);
}

List<string> dedupedCCEmailAddresses = ccEmailAddresses.Distinct().ToList();
List<string> emailAddressToBeRemoved = new List<string>();


//Check for each unique email addresses, how many records are there
foreach (string emailAddress in dedupedCCEmailAddresses)
{
    int count = ccPartyList.Count(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
    if (count > 1) //Same email address; Multiple Records
    {
       emailAddressToBeRemoved.Add(emailAddress);
    }
}

//Remove ALL Activity Party from the List
foreach (string emailAddress in emailAddressToBeRemoved)
{
    ccPartyList.RemoveAll(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
    ActivityParty unResolvedEmailAddress = new ActivityParty();
    unResolvedEmailAddress.AddressUsed = emailAddress;
    ccPartyList.Add(unResolvedEmailAddress);
}

Email emailToUpdate = new Email();
emailToUpdate.Id = emailId;
emailToUpdate.Cc = ccPartyList;
crmService.Update(emailToUpdate);

我现在用以下代码更新了它,其中我删除了所有 CC 方。

if (localContext == null)
{
    throw new ArgumentNullException("localContext");
}

IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService service = localContext.OrganizationService;
tracingService = localContext.TracingService;

Email emailFromTarget = (context.InputParameters.Contains("Target")
                        && context.InputParameters["Target"] is Entity)
                        ? 
((Entity)context.InputParameters["Target"]).ToEntity<Email>() : null;

Entity email = service.Retrieve(Email.EntityLogicalName, emailFromTarget.Id, new ColumnSet("cc"));

EntityCollection cc = email.GetAttributeValue<EntityCollection>("cc");
if (cc != null)
{
    cc.Entities.ToList().ForEach(party =>
    {
        cc.Entities.Remove(party);
    });
}

email["cc"] = cc;
service.Update(email);

甚至,然后 CC 字段继续保留数据 post 创建。

我正在 Post 创建插件中执行此操作。那样不是删除它们吗?我是否必须将其作为工作流程/CWA 来执行?

您建议的代码有什么问题?

// Get your cc field
var cc = email.GetAttributeValue<EntityCollection>("cc");

// Iterate through the collection. If there's a partyId, it's a party list, so remove it
cc.Entities.ToList().ForEach(entity =>
{
    var partyId = entity.GetAttributeValue<EntityReference>("partyid");
    if (partyId != null)
        cc.Entities.Remove(entity);
}

// Update your email
email["cc"] = cc;
service.Update(email);

而不是 post 操作,在创建插件的预操作中注册它并从目标实体中删除 dupe CC partylist。这会起作用。