2

我想在我的 Dynamics CRM 2011 解决方案中编辑电子邮件模板。

我将在表单中添加一个组合框,允许用户决定电子邮件应该是什么分类,例如。“A”、“B”或“C”

这有助于我们的电子邮件网关知道在归档等方面如何处理某些邮件。此外,设置标题将使用户(收件人)更难解密(降低分类),如果我们只是推动分类,这很容易做到在主题行中(是的,我知道我们仍然容易被复制和粘贴,但请尝试告诉我的客户)。

就在发送电子邮件之前,有一个事件可以让我获取邮件项目并添加邮件标题,还可以操作主题行或其他一些可编辑字段等内容。

我编写了一个 Outlook 加载项,它在发送时运行此代码,并且基本上想知道我应该将类似代码放在 Dynamics 中的什么位置。

    private Dictionary<string, List<string>> _classifications;

    private const string ProtectiveMarkingSchemaName = "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/X-Protective-Marking";

    private const string Version = "0.1";
    private const string Namespace = "xyz.com";


void ApplicationItemSend(object item, ref bool cancel)
    {
        // GUARD
        if (!(item is MailItem)) return;

        if (ClassificationDropDown.SelectedItem == null ||
            String.IsNullOrEmpty(ClassificationDropDown.SelectedItem.Label))
        {
            cancel = true;
            return;
        }

        // CURRENT ITEM
        var mailItem = (MailItem)Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;

        // PREPARE MARKING
        var origin =
            Globals.ThisAddIn.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress;

        var classification = new StringBuilder();
        classification.AppendFormat("SEC={0}", ClassificationDropDown.SelectedItem.Label);
        if (DisseminationDropDown.SelectedItem != null)
        {
            if (!String.IsNullOrEmpty(DisseminationDropDown.SelectedItem.Label))
            {
                var cat = DisseminationDropDown.SelectedItem.Label;
                classification.AppendFormat(", CAVEAT={0}", cat);
            }
        }

        // FILTHY HACK
        if (mailItem.Subject == null)
        {
            mailItem.Subject = " ";
        }

        // FIND OLD MARKINGS
        var start = mailItem.Subject.IndexOf('[');
        var end = mailItem.Subject.LastIndexOf(']');
        if (end - start > 0)
            mailItem.Subject = mailItem.Subject.Remove(start, (end - start) + 1);

        // APPLY MARKING
        mailItem.Subject = String.Format("{0} [{1}]", mailItem.Subject.TrimEnd(), classification);
        mailItem.PropertyAccessor.SetProperty(
            ProtectiveMarkingSchemaName,
            String.Format("[VER={0}, NS={1}, {2}, ORIGIN={3}]", Version, Namespace, classification, origin));
    }
4

2 回答 2

2

这不是我有任何直接经验的领域,但我可以告诉您的是,email在 CRM SDK 中(通常)使用的对象是底层电子邮件消息的抽象。

尽管如此,SDK 暴露了一个可能有用的区域。查看 SDK 中称为Microsoft Dynamics CRM 的自定义电子邮件提供程序的部分,该部分旨在按照您想要的方向公开某些内容:

电子邮件提供程序是与 Microsoft Dynamics CRM 电子邮件路由器服务集成的可插入组件。提供商负责专门的电子邮件处理和与电子邮件协议的接口。

也就是说,我看不到任何暴露邮件标题的对象,但我看起来并不难。

(请注意,它会重定向到CRM 4.0“电子邮件提供商”SDK 主题以获取有用的内容,但这仍然有效且受支持)。

于 2012-08-23T16:12:01.367 回答
2

我目前有一张 Microsoft 的票,但他们最初的反应是这无法完成。

他们建议的解决方案是使用邮件网关上的规则来添加标题信息,如果我只想编写相同的标题信息,则可以解决该问题,但如果我想要标题中的变量值会变得更加复杂。

我看了一下 Greg 的建议,虽然它们对我来说是一个很好的学习练习,但我在那里找不到解决方案。

可以编写一个执行此操作的工作流,但是我必须考虑 CRM 在发送邮件时所做的所有其他垃圾,坦率地说,文档对于我需要做的事情有点粗略,但我最好的猜测是像这样。

  • 使用功能区编辑器隐藏原始发送按钮
  • 使用选项向电子邮件表单添加下拉列表
  • 使用 javascript 添加一个新的发送按钮以启动工作流
  • 编写一个工作流程,让电子邮件查找标题值字段并将其塞入标题中
  • 然后发送它。

我不知道这是否会自动关闭活动,或者它是否会保留其上下文,例如(案例中的活动、帐户等),或者这种方法是否会影响审计,因此可能必须考虑这些事情

于 2012-10-03T22:56:11.800 回答