更改插件中电子邮件活动的“发件人”字段

时间:2011-08-11 04:10:54

标签: plugins workflow dynamics-crm-2011

当电子邮件发送到队列并且存在与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中创建电子邮件时它会被触发...

3 个答案:

答案 0 :(得分:0)

问题是您没有更改完全处理的电子邮件。

var email = ((Entity)context.InputParameters["Target"]).ToEntity<Email>();

此行将当前处理的记录转换为email类型的对象。您修改不在操作范围内的记录。您必须修改目标的From(直接或写回)。

对于处理阶段:请查看Event Execution Pipeline。预验证是为了您的任务尽早。我不太确定地址解析何时完成,但我会尝试进行预转换。

答案 1 :(得分:0)

我最终使用了一种解决方法:创建了一个异步后事件,如果存在具有相同电子邮件的联系人,则将该电子邮件活动与该联系人相关联,从而使该用户与该电子邮件关联在“发件人”字段中。

答案 2 :(得分:0)

我正面临着类似的问题。这篇文章here指出它是ActivityParty的一个问题,并且在管道中触发事件的位置,但是我还没有让它为我工作。