当我通过Dynamics CRM发送电子邮件时,如何添加邮件标题

时间:2012-08-21 22:56:56

标签: email dynamics-crm-2011 email-headers

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

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

这有助于我们的电子邮件网关知道如何处理与存档等有关的某些邮件。同时设置标题会使用户(收件人)更难解密(降低分类),如果我们只是推动了主题行中的分类(是的,我知道我们仍然容易复制和粘贴,但试着告诉我的客户)。

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

我编写了一个Outlook加载项,在send上运行此代码,基本上想知道我应该在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));
    }

2 个答案:

答案 0 :(得分:2)

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

尽管如此,SDK还是有一个可能有用的区域。看看SDK中名为Custom Email Providers for Microsoft Dynamics CRM的部分,它看起来像你想要的方向展示一些东西:

  

电子邮件提供商是一个与其集成的可插拔组件   Microsoft Dynamics CRM电子邮件路由器服务。提供者是   负责专门的电子邮件处理和与...的接口   电子邮件协议。

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

(请注意,它会重定向到CRM 4.0 "Email Providers" SDK topic以获取有用的内容,但这仍然有效且受支持。)

答案 1 :(得分:2)

我现在有一张微软票,但他们最初的反应是无法做到这一点。

他们建议的解决方案是使用邮件网关上的规则添加标题信息,如果我只想写相同的标题信息,但如果我想在标题中使用变量值,那么它就会解决这个问题。

我看了一眼格雷格的建议,虽然对我来说这是一个很好的学习练习但我找不到解决方案。

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

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

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