問題: 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
}
}