当电子邮件发送到队列并且存在与CRM中的“发件人”电子邮件关联的联系人时,在向电子邮件活动发送电子邮件时,系统会自动使用联系人信息填写“发件人”字段。但是,如果CRM中也存在具有相同电子邮件的用户,则系统始终会选择系统用户而不是联系人。我需要覆盖此行为,如果有电子邮件存在,则始终选择联系人。
我为事件Create for email创建了一个后期操作插件(也尝试了一个预操作插件),试图覆盖From字段。问题是,它不起作用。当我调试插件时,它会安静地通过作业而没有任何错误,然后相同的插件再次触发同一个电子邮件。然后再次。再一次。
当我尝试创建一个新的电子邮件并使用相同的ActivityList []时,我试图用于触发事件的实体,它可以工作。似乎问题是CRM不允许从插件中更改From字段,或者我做错了什么?如果这是CRM强制执行的限制,是否有办法绕过它?
我的代码如下:
var email = ((Entity)context.InputParameters["Target"]).ToEntity<Email>();
...
var oldFrom = ((EntityCollection)email.Attributes["from"]).Entities;
List<ActivityParty> newFrom = new List<ActivityParty>();
foreach (Entity party in oldFrom)
{
EntityReference entRef = (EntityReference)party.Attributes["partyid"];
if (entRef.LogicalName == SystemUser.EntityLogicalName)
user = userLogic.Get(new Guid(entRef.Id.ToString()));
if (user == null) return;
string emailAddress = user.InternalEMailAddress;
Contact contact = contactLogic.LookupPASIndividual("", emailAddress);
if (contact != null)
{ newFrom.Add(new ActivityParty() {PartyId = new EntityReference(Contact.EntityLogicalName, contact.ContactId.Value) });
}
else
return;
}
email.From = newFrom;
更新:所以我现在在预验证上注册了插件,当路由器创建电子邮件活动时它没有被触发,当用户在CRM中创建电子邮件时它会被触发...
答案 0 :(得分:0)
问题是您没有更改完全处理的电子邮件。
var email = ((Entity)context.InputParameters["Target"]).ToEntity<Email>();
此行将当前处理的记录转换为email
类型的对象。您修改不在操作范围内的记录。您必须修改目标的From
(直接或写回)。
对于处理阶段:请查看Event Execution Pipeline。预验证是为了您的任务尽早。我不太确定地址解析何时完成,但我会尝试进行预转换。
答案 1 :(得分:0)
我最终使用了一种解决方法:创建了一个异步后事件,如果存在具有相同电子邮件的联系人,则将该电子邮件活动与该联系人相关联,从而使该用户与该电子邮件关联在“发件人”字段中。
答案 2 :(得分:0)
我正面临着类似的问题。这篇文章here指出它是ActivityParty的一个问题,并且在管道中触发事件的位置,但是我还没有让它为我工作。