【问题标题】:CRM - sending email to contacts in sub gridCRM - 向子网格中的联系人发送电子邮件
【发布时间】:2017-04-03 09:00:41
【问题描述】:

我在一家慈善机构工作,我们希望使用 Dynamics 365 来支持我们的筹款团队。我们创建了一个“筹款活动”实体,与联系人实体有 N:N 关系(在我们的组织中重命名为“个人”。我在每个实体上都有一个子网格,以便我们可以从联系人记录中将联系人添加到事件中或从事件记录。 我们需要能够向注册参加活动的每个人发送电子邮件,以在活动开始前祝他们好运。我已经针对“筹款活动”实体创建了一个工作流,在活动开始日期前 7 天运行,但是当我对此进行测试时,系统作业显示“错误;需要注意”,当我查看该过程时,它显示一条消息“The电子邮件必须至少有一个收件人才能发送。” Process error image 在 WF 发送电子邮件属性中,我尝试在“收件人”字段中使用可用列表中的“联系人”和“命名联系人(查找)”(请参见下面的屏幕截图),但两个选项的结果相同。 To line option list image 我的测试事件有 2 个链接到它的个人(联系人),我可以在事件记录的子网格中看到他们,但我似乎无法向他们发送电子邮件。 以下是失败进程的详细信息:

Plugin Trace:
[Microsoft.Xrm.Sdk.Workflow: Microsoft.Xrm.Sdk.Workflow.Activities.SendEmail]
[SendEmailStep1]
Error Message:
Unhandled Exception:
System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: The e-mail must have at least one recipient before it can be sentDetail: 

<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">

<ActivityId>9161cfb2-308e-4b19-af39-b859a78f132f</ActivityId>

<ErrorCode>-2147218684</ErrorCode>

<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />

<Message>The e-mail must have at least one recipient before it can be sent</Message>

<Timestamp>2017-03-31T11:07:27.6562583Z</Timestamp>

<ExceptionSource i:nil="true" />

<InnerFault>

<ActivityId>9161cfb2-308e-4b19-af39-b859a78f132f</ActivityId>

<ErrorCode>-2147218684</ErrorCode>

<ErrorDetails xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />

<Message>The e-mail must have at least one recipient before it can be sent</Message>

<Timestamp>2017-03-31T11:07:27.6562583Z</Timestamp>

<ExceptionSource i:nil="true" />

<InnerFault i:nil="true" />

<OriginalException i:nil="true" />

<TraceText i:nil="true" />

</InnerFault>

<OriginalException i:nil="true" />

<TraceText>[Microsoft.Xrm.Sdk.Workflow: Microsoft.Xrm.Sdk.Workflow.Activities.SendEmail]

[SendEmailStep1]

</TraceText>

</OrganizationServiceFault>

at Microsoft.Crm.Workflow.Services.SendEmailActivityService.Execute(ActivityContext executionContext, SendEmail sendEmail)

at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)

at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

是否可以做我正在尝试使用的开箱即用功能?如果是这样,我错过了什么? 谢谢, 保罗

【问题讨论】:

  • 看起来您正在尝试重新创建标准的 Campaign 功能,请检查一下(如果您由于某种原因尚未排除它)它是为了向您的客户“发送垃圾邮件”,所以它应该是相当的接近你所需要的
  • 感谢 Alex,我尝试过使用 Campaigns,但它并不能真正满足我们对此的要求,但它肯定会对我列表中的另一个项目有所帮助。

标签: email dynamics-crm dynamics-crm-online subgrid dynamics-365


【解决方案1】:

仅仅通过配置是不可能实现的。您出现此错误是因为您没有引用子网格中的联系人,而是引用了一个名为“Contact”的属性,该属性可能为空并且导致错误。唯一的方法是创建一个自定义工作流活动,它将获取所有必要的联系人并将其放入您的电子邮件中。如果您不想编码,可以使用 Aiden Kaskela 的工作流元素来实现您的目标:

https://kaskelasolutions.com/how-to-add-dynamic-recipients-to-an-email/

【讨论】:

  • 嗨 Pawel,我查看了 Aiden 的工作流程元素,虽然它允许我获取电子邮件的联系人并发送其他元素,但没有通过,所以看起来我将拥有查看创建自定义工作流活动。我不是开发人员(因此试图使用开箱即用的功能),所以我需要在我的组织中找到人来协助解决这个问题。再次感谢您的建议。
【解决方案2】:

我们做了这样的事情。

在电子邮件创建消息的预操作中注册一个插件并在其中包含此逻辑。

这将在电子邮件To 列表中添加来自 N:N 联系人相交实体的收件人。

    ConditionExpression frCondition1 = new ConditionExpression();
    ConditionExpression frCondition2 = new ConditionExpression();
    EntityCollection frResponse = new EntityCollection();
    EntityCollection toOwner = new EntityCollection();

    toOwner = targetEntity.GetAttributeValue<EntityCollection>("to");

    frCondition1 = CreateConditionExpression("parentIdcolummn", ConditionOperator.Equal, new string[] { parent.Id.ToString() });
    frCondition2 = CreateConditionExpression(statuscode, ConditionOperator.Equal, new object[] { 1 });

    ConditionExpression[] conditions = new ConditionExpression[] { frCondition1, frCondition2 };

    FilterExpression filterExpression = new FilterExpression();

filterExpression.Conditions.AddRange(conditions);
filterExpression.FilterOperator = LogicalOperator.And;

QueryExpression queryExpression = new QueryExpression();
queryExpression.ColumnSet = GenerateColumnSet("columnNames");
queryExpression.EntityName = "entityName";
queryExpression.Criteria = filterExpression;
queryExpression.NoLock = true;

    frResponse =  (EntityCollection)service.RetrieveMultiple(queryExpression);

    if(frResponse != null && frResponse.Entities.Count > 0)
    {
        //Adding all FRs in the email
        foreach (Entity FilingRep in frResponse.Entities)
        {
            Guid frGuid = ((EntityReference)FilingRep["contactLookupfieldname"]).Id;

            Entity toParty = new Entity("activityparty");

            toParty[ActivityParty.ActivityPartId] = new EntityReference("contact", frGuid);

            ToOwner.Entities.Add(toParty);
        }
    }

    targetEntity[EmailEntityAttributeName.To] = toOwner;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2013-10-03
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多