2013-02-04 123 views
4

問題:我們使用CRM for Outlook插件自動登錄我們的支持電子郵件,但員工之間的內部電子郵件(其中一些包含敏感信息)也被記錄下來。Dynamics CRM 2011 - 通過插件創建實體

理想的解決方案:我試圖寫一個事件前(即「創建電子郵件」消息)插件來阻止內部郵件的自動記錄,但(顯然)停止從正在執行的消息的唯一途徑是在事件前階段拋出一個異常,但這總是導致在Outlook中顯示錯誤消息(我們顯然不能這樣做)。根據文檔,只有「InvalidPluginExecutionExeception」應該向用戶顯示消息,但情況並非如此,因爲所有異常都會在用戶的Outlook應用程序中產生錯誤消息。

潛在解決方案:還有一個「CheckPromoteEmail」消息(根據文檔)確定一個電子郵件是否應晉升爲CRM(I假設「提升到CRM」是指「使電子郵件實體在CRM中存儲「),但我無法找到任何可以讓我告訴CRM不推薦電子郵件的上下文。在我可以設置的上下文中是否埋藏了一些標誌,或者某種方式來發送電子郵件,以便CRM自己的邏輯決定不存儲它?

解決方法解決方案:我所知道的唯一的其他解決方案(中提到here)只是清除主題和電子郵件的內容,它已被創建之後,但我寧願從創建阻止電子郵件第一個地方比編輯或刪除它後的時間和資源浪費了創建電子郵件。

有沒有一種乾淨的方法來停止插件操作?或從任何地方?如果沒有,有人知道微軟爲什麼不提供這個功能嗎?在操作失敗的情況下,他們已經具備了強大的回滾功能,爲什麼他們不給我一種調用回滾的方式?

這裏是我的代碼的情況下,它是在回答我的問題有所幫助:

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   
    } 
} 
+0

由於您的業務規則是記錄所有電子郵件,因此您沒有給Outlook用戶選擇跟蹤電子郵件的選項,您是否想過使用電子郵件路由器而不是Outlook來獲取電子郵件進入CRM? – Nicknow

+0

是的,我們甚至在我們的CRM上安裝了路由器,但我們還沒有使用它。我們想開始使用隊列等,所以我認爲我們最終可能會朝這個方向前進。 – Richard

回答

7

多少血,汗水和淚水之後,我終於想通了如何做到這一點:

你必須使用一個異步事件後插件「創建電子郵件」消息,從數據庫中刪除電子郵件與創建後的CRMService一起使用。它必須是異步的,因爲您需要等待CRM完成創建並放下實體,然後才能刪除它。否則,該過程掛起。

所有這些解決方案會好些,但供參考,不能:

  1. 拋出一個異常在事件前取消創建/推廣電子郵件操作,而無論是顯示用戶的錯誤信息或對他們的Outlook造成嚴重破壞。即使只有InvlaidPluginExectuionExecption應該向用戶顯示消息,所有異常都會向用戶顯示錯誤消息。
  2. 阻止向CRM發送電子郵件的促銷。 CheckPromoteEmail消息事件前(驚人地)沒有提供有關可能被提升的消息的信息(因此沒有數據用於決定消息是否應該被提升),也沒有什麼東西可以用來告訴CRM不推薦消息。而且,如果使用前/後事件並嘗試使用輸出參數並在那裏更改ShouldPromote標誌,則它不會執行任何操作。
  3. 在爲其創建實體之前清除電子郵件的主體內容 - 在事件前對主體內容所做的任何更改都不會與執行上下文保持一致,並且在覈心操作開始時會丟失。

Maddening。

2

對不起,解決辦法是你唯一的選擇。通過插件停止操作的唯一方法是拋出異常。微軟爲什麼要這樣做?我認爲他們不希望插件失敗。

至於解決方法,您應該清除主題和正文之前他們通過在事件前插件中清除它們進入數據庫,然後在事件異步插件中清理記錄本身​​。這種敏感信息也不會將其納入任何審覈日誌中。

最後,看看DeliverPromoteEmail而不是CreateEmail。 Outlook使用DeliverPromoteEmail來創建跟蹤的電子郵件。這樣,您仍然可以在CRM UI中創建不觸發此插件的電子郵件(如果需要)。

編輯CheckPromoteEmail只着眼於主題(和/或電子郵件標題郵件ID)來決定的電子郵件是否應該被跟蹤的跟蹤令牌,所以它不會是有用的要麼。

0

在個人設置中,您可以選擇跟蹤所有電子郵件,電子郵件對CRM電子郵件的回覆(已跟蹤的電子郵件),記錄中的電子郵件(帳戶等)以及啓用了電子郵件的記錄中的電子郵件。