5

問題: CRM for Outlookプラグインを使用して、サポートメールを自動的にログに記録しますが、従業員間の内部メール(一部には機密情報が含まれています)もログに記録されます。

理想的な解決策:内部電子メールの自動ログ記録をブロックするプレイベント(「電子メールの作成」メッセージ)プラグインを作成しようとしていますが、(明らかに)メッセージの実行を停止する唯一の方法は、イベント前のフェーズですが、これにより常にエラーメッセージがOutlookに表示されます(これは明らかに表示できません)。ドキュメントによると、「InvalidPluginExecutionExeception」のみがユーザーにメッセージを表示することになっていますが、すべての例外がユーザーのOutlookアプリケーションでエラーメッセージを表示するため、これは当てはまりません。

考えられる解決策:(ドキュメントによると)電子メールをCRMに昇格させるかどうかを決定する「CheckPromoteEmail」メッセージもあります(「CRMに昇格」は「CRMに保存する電子メールエンティティを作成する」ことを意味すると思います) 、しかし、CRMに電子メールを宣伝しないように指示するようなコンテキストでは何も見つかりませんでした。私が設定できるコンテキストに埋め込まれたフラグ、またはCRM自体のロジックがそれを保存しないことを決定するように電子メールを挿入する方法はありますか?

回避策:私が知っている他の唯一の解決策(ここで説明)は、作成後にメールの件名と内容をクリアするだけですが、編集や削除よりも、そもそもメールの作成を停止したいですメールの作成に時間とリソースが浪費された後です。

プラグインからの操作を停止するクリーンな方法はありますか?またはどこからでも?ない場合、Microsoftがこの機能を提供しなかった理由を誰かが知っていますか?操作が失敗した場合に備えて、内部にはすでに装甲艦のロールバック機能があります。ロールバックを呼び出す方法を教えてくれませんか?

これが私の質問に答えるのに役立つ場合の私のコードです:

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          
    }
}
4

3 に答える 3

8

たくさんの血、汗、涙を流した後、私はついにこれを行う方法を見つけました:

「電子メールの作成」メッセージで非同期ポストイベントプラグインを使用して、作成後にCRMServiceを使用してDBから電子メールを削除する必要があります。CRMが作成を終了し、エンティティを「離す」のを待ってから削除する必要があるため、非同期である必要があります。そうしないと、プロセスがハングします。

これらのソリューションのいずれかが優れていたはずですが、参考までに、次のことはできません。

  1. プレイベントで例外をスローして、ユーザーにエラーメッセージを表示したり、Outlookに大混乱を引き起こしたりせずに、電子メールの作成/昇格操作をキャンセルします。InvlaidPluginExectuionExecptionのみがユーザーにメッセージを表示することになっていますが、すべての例外はユーザーにエラーメッセージを表示します。
  2. CRMへの電子メールの宣伝をブロックします。CheckPromoteEmailメッセージのプレイベント(驚くべきことに)は、潜在的にプロモートされるメッセージに関する情報を提供せず(したがって、メッセージをプロモートするかどうかを決定するために使用するデータはありません)、CRMにメッセージをプロモートしないように指示するために使用するものはありません。また、イベント前/イベント後を使用して出力パラメータを使用し、そこでShouldPromoteフラグを変更しても、何も実行されません。
  3. エンティティが作成される前に、電子メールの本文の内容をクリアします。プレイベントで本文の内容に加えた変更は、実行コンテキストにとどまらず、コア操作の開始時に失われます。

狂気。

于 2013-02-12T00:00:33.320 に答える
2

申し訳ありませんが、回避策は唯一の選択肢です。プラグインを介して操作を停止する唯一の方法は、例外をスローすることです。なぜマイクロソフトはこれをしたのですか?私は彼らがプラグインが黙って失敗することを望まなかったと思います。

回避策としては、データベースに入る前に、イベント前のプラグインでサブジェクトと本文をクリアしてから、イベント後の非同期プラグインでレコード自体をクリーンアップする必要があります。このように、機密情報は監査ログにも反映されません。

最後に、のDeliverPromoteEmail代わりにを見てくださいCreateEmailDeliverPromoteEmail追跡された電子メールを作成するためにOutlookによって使用されるものです。このようにして、このプラグインを起動しない電子メールをCRM UIで作成できます(必要な場合)。

edit CheckPromoteEmailは、件名の追跡トークン(および/または電子メールヘッダーのMessageID)のみを調べて、電子メールを追跡する必要があるかどうかを判断するため、どちらも役に立ちません。

于 2013-02-05T03:17:23.450 に答える
0

個人設定には、すべての電子メール、CRM電子メールへの電子メール応答(すでに追跡されている電子メール)、レコード(アカウントなど)からの電子メール、および電子メールが有効になっているレコードからの電子メールを追跡するオプションがあります。

于 2013-02-11T12:39:49.390 に答える