Dynamics 365中使用工作流发邮件让其可以发往文本字段指定的邮箱

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复397或者20200307可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

因为工作流的【发送邮件】步骤中的收件人只能选择启用邮件的实体,但是实际中,我们很可能需要能发往指定的文本邮箱,怎么办呢?我的办法是定制化一下,增加一个Email实体的Create的Pre阶段的插件,设置下收件人,下面是我的做法。

首先通过点击 Advanced Settings 导航到类似的网址 https://crm147634.crm5.dynamics.com/main.aspx?settingsonly=true,也可以直接输入导航到设置。

 

 再导航到 Settings > Administration > System Settings ,切换到 【Email】这个Tab,选中【Allow message with unresolved email recipients to be sent】旁边的【Yes】并保存。

这样在界面上新建邮件的时候,收件人为不存在系统中的用户,客户,联系人,队列的文本格式邮箱也可以作为收件人了。

 

如下图。虽然收件人识别不了,显示为红色,但是邮件还是可以发出的。

 

使用工作流中的【发送邮件】步骤同样也报错,但是可以保存这个步骤,可以发送邮件。

 

 邮件中可以插入字段值,若是插入的是选项集字段,显示的选项集的文本,若是查找字段(lookup),显示的是查找记录的主属性的值。当然还可以插入链接,在邮件中点击链接就可以打开Dynamics 365中的记录,当然要有权限查看,需要登录。

 

 但是工作流发邮件一般是获取动态值作为收件人,如果实体不启用邮件功能如下,是不能将其作为收件人字段值的。

 

 下面进一步客制化化,我为Email实体增加两个字段,一个是否使用自定义的收件人字段,是否类型,默认为否,另一个就是单行文本类型的自定义收件人字段。

在Email实体的Create消息的Pre阶段撰写代码,可以参考 Working with Dynamics CRM Activity Party Lists in C# Plugins ,我这里使用的代码如下:

using Microsoft.Xrm.Sdk;
using System;

namespace Orchid.Crm.Plugins
    {
        public class EmailPreCreate : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                //获取日志服务
                ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                tracingService.Trace($"Enter {this.GetType()} on {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity currentEntity = (Entity)context.InputParameters["Target"];
                    //如果要使用自定义的收件人邮箱地址且自定一收件人邮箱地址字段有值的话
                    if (currentEntity.GetAttributeValue<bool>("dyn_usingcustomto") && currentEntity.Contains("dyn_customto"))
                    {
                        var customTo = currentEntity.GetAttributeValue<string>("dyn_customto").Split(';');
                        tracingService.Trace($"dyn_customto= {currentEntity.GetAttributeValue<string>("dyn_customto")}");
                        EntityCollection toEC = new EntityCollection();
                        Entity partyTo = null;
                        foreach (var emailaddr in customTo)
                        {
                            if (!string.IsNullOrEmpty(emailaddr) && emailaddr.Length >= 3)
                            {
                                partyTo = new Entity("activityparty");
                                partyTo["addressused"] = emailaddr;
                                toEC.Entities.Add(partyTo);
                            }
                        }
                        if (currentEntity.Contains("to"))
                        {
                            EntityCollection toECOriginal = currentEntity["to"] as EntityCollection;
                            toEC.Entities.AddRange(toECOriginal.Entities);
                        }
                        if (toEC.Entities.Count >= 1)
                            currentEntity["to"] = toEC;
                        }
                    }
                }
                tracingService.Trace($"Leave {this.GetType()} on {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
            }
        }
    }
}

 

注册消息如下:

  

在使用工作流发邮件的时候,需要将使用自定义的收件人字段设置为True,然后在自定义收件人字段设置动态值即可。

因为自定义的收件人字段默认值为false,所以正常的邮件不受影响。

posted @ 2020-03-08 08:58  微软MVP(15-18)罗勇  阅读(668)  评论(0编辑  收藏  举报