问题:我们使用 CRM for Outlook 插件自动记录我们的支持电子邮件,但员工之间的内部电子邮件(其中一些包含敏感信息)也被记录下来。
理想的解决方案:我正在尝试编写一个事件前(“创建电子邮件”消息)插件来阻止内部电子邮件的自动记录,但(显然)阻止消息执行的唯一方法是在事件前阶段,但这总是会导致在 Outlook 中显示错误消息(我们显然不能拥有)。根据文档,只有“InvalidPluginExecutionExeception”应该向用户显示消息,但情况并非如此,因为所有异常都会在用户的 Outlook 应用程序中导致错误消息。
潜在解决方案:还有一个“CheckPromoteEmail”消息(根据文档)确定是否应将电子邮件提升到 CRM(我假设“提升到 CRM”的意思是“使电子邮件实体存储在 CRM 中”) ,但我在上下文中找不到任何可以让我告诉 CRM 不要推广电子邮件的内容。是否有一些标记隐藏在我可以设置的上下文中,或者以某种方式嵌入电子邮件以便 CRM 自己的逻辑决定不存储它?
解决方法解决方案:我知道的唯一其他解决方案(在此处提到)仅在创建电子邮件后清除其主题和内容,但我宁愿首先停止创建电子邮件而不是编辑或删除在浪费时间和资源创建电子邮件之后。
有没有一种干净的方法来停止插件的操作?还是来自任何地方?如果没有,有谁知道微软为什么不提供这个功能?如果操作失败,他们已经在后台具有铁定的回滚功能,为什么不给我一种调用回滚的方法呢?
这是我的代码,以防它有助于回答我的问题:
public class InternalEmailFilter : IPlugin
{
void IPlugin.Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext _context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity e = (Entity)_context.InputParameters["Target"];
bool shouldStore = ShouldStoreInCRM(e);
if (shouldStore == false)
{
throw new Exception(); //attempting to stop the operation without an InvalidPluginExecutionException, but still results in error message to user
}
}
protected bool ShouldStoreInCRM(Entity e)
{
List<Entity> parties = new List<Entity>();
var atttributes = e.Attributes;
if (atttributes.ContainsKey("to") == true) parties.AddRange((atttributes["to"] as EntityCollection).Entities);
if (atttributes.ContainsKey("from") == true) parties.AddRange((atttributes["from"] as EntityCollection).Entities);
if (atttributes.ContainsKey("cc") == true) parties.AddRange((atttributes["cc"] as EntityCollection).Entities);
if (atttributes.ContainsKey("bcc") == true) parties.AddRange((atttributes["bcc"] as EntityCollection).Entities);
foreach (Entity p in parties)
{
if (p.LogicalName == "activityparty" && p.Attributes.ContainsKey("addressused") == true && p.Attributes["addressused"] != null)
{
if (p.Attributes["addressused"].ToString().ToLower().Contains("@ourdomain.com") == false)
{
return true; //someone connected in the email is not an employee, store the email
}
}
}
return false; //everyone was an employee, do not store
}
}