背景
CRM 2011(和 CRM Online)中的工作流程和对话流程允许我们向启用电子邮件的记录(例如联系人、帐户和用户)发送电子邮件。如果启用电子邮件的记录没有电子邮件地址,则该过程将失败并出现异常(工作流保持等待状态,对话框抛出异常):
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Object address not found on party or party is marked as non-emailable
我的场景
在许多情况下,因为无法发送电子邮件而对整个过程造成错误是很严厉的(同样,我承认在很多情况下这种行为也是可取的)。举个例子,如果我正在创建和更新许多记录作为大型工作流程的一部分,并且只是希望在流程结束时发送一封简单、礼貌的确认电子邮件,那么我不希望整个流程仅仅因为最后一步而失败无法完成。我可以在工作流程中添加一个简单的条件语句,以在发送电子邮件步骤之前检查地址是否存在。这可行,但我(或更具体地说,我的用户)需要记住对创建的每个电子邮件步骤执行此操作。
理论解决方案
理想情况下,我会有一个子工作流程,它接受电子邮件对象作为输入,然后在发送电子邮件之前运行一些检查以确认有发件人和收件人。如果数据丢失,我可以默默地使子流程失败,或者调用不同的逻辑,例如向原始用户发送电子邮件或写入错误记录。
但是,考虑到以下情况......
- CRM Online 仍不支持自定义工作流程序集
- 工作流程不接受传入参数
- 即使是对话框也不支持“电子邮件对象”作为输入参数,也不支持将值数组(例如收件人)作为输入参数
- 子对话框完成后不会将控制权返回给调用者
...我正在努力构想一种模式或解决方案,它可以有效地让我避免用户必须记住在他们创建的每个工作流程或对话框中进行硬编码检查(以检查是否存在收件人电子邮件地址)。
理想情况下,我想要类似通用子工作流的东西,它接受电子邮件对象(或其序列化或其他表示形式),进行检查并发送电子邮件(如果可以的话)。
交给你了
我尝试设计一个自定义解决方案,但它很快就变得过度设计(系统实体上的插件等)。否则我看不出有什么方法可以避免让用户承担责任。有没有其他人遇到过类似的要求,并且更好地设计了解决方案?
最佳答案
嗯,我可以想到一个非常简单的解决方案。
电子邮件中的新字段 - “自动发送”,位,默认否
新工作流程 - 创建电子邮件,如果“自动发送”== 是 && 发送包含数据 && 收件人包含数据 -> 在上下文中发送电子邮件
在所有其他工作流程中,不要使用“发送电子邮件”操作,而是使用“创建记录”操作来创建电子邮件记录,照常填充电子邮件,同时填充“自动发送”字段.
这样,用户几乎可以像平常一样创建电子邮件,但您可以使用单个工作流程来执行验证逻辑并实际发送它。
关于email - 通过进程处理 "send email"步骤的可重用且稳健的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12348832/