宏获取当前用户宏而不是联系人

Macro gets current user macro not contacts

我正在尝试创建一个自定义模块,该模块存储一些包含基于收件人列表的宏的文本。收件人列表来自特定的联系人组。

我有一个带有文本 "Hi {%Contact.ContactFirstName%}" 的富文本编辑器,需要根据联系人将其转换为实际名字并将其存储在 table.

首先,我将获取联系人组成员的电子邮件并将其放入一个数组中。

然后,我使用了 Send(IssueInfo issue, string recipients) 方法并将电子邮件传递给该方法解析宏并将其存储在 table.

但是,存储在 table 中的值是当前用户的名字(即我自己)而不是联系人的名字。

下面是获取联系人组中所有成员的代码。

 var members = ContactInfoProvider.GetContacts().WhereIn("ContactID", ContactGroupMemberInfoProvider.GetRelationships().Column("ContactGroupMemberRelatedID").WhereEquals("ContactGroupMemberType", 0).WhereIn("ContactGroupMemberContactGroupID", IssueContactGroupInfoProvider.GetIssueContactGroups().Column("ContactGroupID").WhereEquals("IssueID", issue.IssueID))).WhereNotEmpty("ContactMobilePhone");

foreach (var member in members)
{
   email += ValidationHelper.GetString(member.GetValue("ContactEmail"), "") + ";";
}

这是解析宏并存储在 table 中的代码。其中大部分仅来自电子邮件营销模块代码。

 public void Send(SMSIssueInfo issue, string recipients)
    {
        if (issue == null)
            throw new ArgumentNullException(nameof(issue));
        if (string.IsNullOrEmpty(recipients))
            throw new ArgumentNullException(nameof(recipients));
        SMSInfo newsletterInfo = SMSInfoProvider.GetSMSInfo(issue.IssueSMSID);
        if (newsletterInfo == null)
            throw new InvalidOperationException("SMS not found.");
        SiteInfo siteInfo = SiteInfoProvider.GetSiteInfo(newsletterInfo.SMSSiteID);
        if (siteInfo == null)
            throw new InvalidOperationException("SMS site not found.");
        string[] strArray = recipients.Split(new char[1]
        {
        ';'
        }, StringSplitOptions.RemoveEmptyEntries);
        SMSTemplateInfo SMSTemplate = SMSTemplateInfoProvider.GetSMSTemplateInfo(issue.IssueTemplateID);


        foreach (string smsrecipients in strArray)
        {

            string str = "";
            str = GetEmailBody(issue, newsletterInfo, SMSTemplate, null, false, siteInfo.SiteName, null, null, null);

            SMSIssueHelper issueHelper = new SMSIssueHelper();

            if (issueHelper.LoadDynamicFields(null, newsletterInfo, null, issue, true, siteInfo.SiteName, null, null, null))
            {
                //.Subject = issueHelper.ResolveDynamicFieldMacros(message.Subject, newsletterInfo, issue);
                str = issueHelper.ResolveDynamicFieldMacros(str, newsletterInfo, issue);
            }

            string absolute = LinkConverter.ConvertToAbsolute(str, SMSIssueHelper.GetNewsletterLinksBaseUrl(newsletterInfo, siteInfo));

            var contacts = ContactInfoProvider.GetContactInfo(smsrecipients);

            SMSQueueInfo smsQueue = new SMSQueueInfo();

            smsQueue.SmsLastModified = DateTime.Now;
            smsQueue.SmsScheduledSendTime = DateTime.Now;
            smsQueue.SmsTo = contacts.ContactMobilePhone;
            smsQueue.SetValue("SmsSubject", ValidationHelper.GetString(issue.GetValue("IssueSubject"), ""));
            smsQueue.SetValue("SmsBody", str);
            smsQueue.SetValue("SmsSiteID", ValidationHelper.GetString(issue.GetValue("IssueSiteID"), ""));
            smsQueue.SetValue("SmsCreated", DateTime.Now);
            smsQueue.SetValue("SmsIsScheduled", 0);
            smsQueue.SetValue("SmsIssueID", ValidationHelper.GetString(issue.GetValue("IssueID"), ""));
            smsQueue.SetValue("SmsClientID", ValidationHelper.GetString(contacts.GetValue("ContactClientID"), ""));
            smsQueue.SetValue("SmsClientName", ValidationHelper.GetString(issue.GetValue("ContactFirstName"), ""));
            smsQueue.SetValue("SmsSenderID", MembershipContext.AuthenticatedUser.UserID);
            smsQueue.SetValue("SmsKey", ValidationHelper.GetString(newsletterInfo.GetValue("SMSKey"), ""));
            smsQueue.SetValue("SmsFrom", ValidationHelper.GetString(newsletterInfo.GetValue("SMSSenderNumber"), ""));
            smsQueue.SetValue("SmsClientName", ValidationHelper.GetString(contacts.GetValue("ContactFirstName"), ""));
            smsQueue.SetValue("SmsStatus", 0);

            SMSQueueInfoProvider.SetSMSQueueInfo(smsQueue);
        }


    }

预期结果将是联系人组内联系人的名字,例如 "Hi John",而不是单击 "Save" 按钮的用户。

我正在使用 Kentico 10.0.42。

您必须为宏解析器设置正确的上下文 (DataSource)。这是 the article how to do it in the email 应该会给你的想法

我同意 Peter 的观点,我在我们的一些项目中使用了相同的方法。基本上,为了获取电子邮件的文本,您需要在代码中执行的所有操作:

  1. 获取包含宏的电子邮件模板文本(它可以包含标准宏和自定义宏)
  2. 为宏解析器注册自定义数据源
  3. 解决macroses然后你就可以发送邮件了!

一个小小的补充,可以使用复杂的数据结构作为宏数据源。下面是动态填充事件(事件页面类型)和参与者(ContactInfo 模块 class)数据的示例:

    public static string GetEventEmailText(string emailTemplateName, string contactEmail)
    {
        var eventItem = EventDocumentService.GetCachedItems().FirstOrDefault();
        var contact = ContactInfoProvider.GetContactInfo(contactEmail);

        var resolver = MacroResolver.GetInstance();
        resolver.SetNamedSourceData("Event", eventItem);
        resolver.SetNamedSourceData("Attendee", contact);
        resolver.Settings.EncodeResolvedValues = true;

        var emailTemplate = EmailTemplateProvider.GetEmailTemplate(emailTemplateName, SiteContext.CurrentSiteName);
        return emailTemplate == null ? string.Empty : resolver.ResolveMacros(emailTemplate.TemplateText);
    }

在电子邮件模板中,我使用了这些宏:

Hi, {% Attendee.ContactFirstName %} {% Attendee.ContactLastName %}

Your event begins: {% Event.Date.ToString() %}