1

我有一个电子邮件正文作为字符串存储在数据库中,如下所示:

这是一个包含许多不同变量的电子邮件正文。亲爱的#name#,<br/>请联系#representativeName#了解更多详情。

我使用存储过程从数据库中提取该字段,然后我想在冷融合端对其进行评估,这样它将插入名称变量的值而不是“#name#”。

我试过使用评估,但这似乎只有在只有一个变量名的情况下才有效。由于其他文本,它会引发错误。

(我不能像这样使用占位符和查找/替换 -在 Coldfusion 字符串中解析变量,因为将其存储在数据库中的全部意义在于用于构建字符串的变量是动态的。例如,在一个如果名称字段可以称为“名称”,在另一种情况下可以称为“名字”等)

4

5 回答 5

2

我将遍历每个 #variableName# 引用并将其替换为评估版本。

一个正则表达式将能够找到它们,然后循环遍历它们并逐个评估它们。

于 2011-11-09T10:03:02.520 回答
1

您需要将其写入文件并 CFINCLUDE 。这会产生编译开销,但这是不可避免的。

您不能将代码保存到文件系统,而只存储对它在数据库中位置的引用吗?这样它只会在它发生变化时重新编译,而不是每次你来使用它时?

<!--- pseudo code --->
<cfquery name="q">
    SELECT fileContent // [etc]
</cfquery>
<cfset fileWrite(expandPath("/path/to/file/to/write/code.cfm"), q.fileContent)>
<cfinclude template="/path/to/file/to/write/code.cfm">
<cfset fileDelete(expandPath("/path/to/file/to/write/code.cfm"))>

这就是基本思想:获取代码、编写代码、包含代码、删除代码。尽管您需要确保创建的文件不会与任何其他文件冲突(根据其他人的建议,使用 UUID 作为文件名或其他内容)。

您还需要对此进行负载测试。我怀疑它会表现得很好。其他人建议使用虚拟文件系统,但我不太确定那里会有很大的收获:需要时间的是编译过程,而不是实际的文件操作。但值得研究。

于 2011-11-09T09:34:38.780 回答
0

自从您发布此内容以来已经有一段时间了-但这正是我所做的。我在寻找其他东西时发现了你的问题。

当我将电子邮件写入数据库时​​,我只是为变量创建了自己的简单语法:

Hello ~FirstName~ ~LastName~,

然后,在我发送的 cfm 文件中,我从数据库中提取电子邮件文本,并将其保存到一个变量中:

<cfset EmailBody = mydatabasequery.HTMLBody>

然后我用我的变量快速剥离我自己的语法(来自另一个名为 RecipientList 的查询):

<cfset EmailBody = ReplaceNoCase(EmailBody, "~FirstName~", "#RecipientList.First#", "ALL")>
<cfset EmailBody = ReplaceNoCase(EmailBody, "~LastName~", "#RecipientList.Last#", "ALL")>

然后我只需发送我的电子邮件:

<cfmail ....>#EmailBody#</cfmail>

我希望你能看到这个。如果您控制电子邮件的创作,我怀疑您这样做,这应该会很好。

罗素

于 2012-01-04T22:39:40.943 回答
0

所以基本上,在研究和阅读答案之后,似乎这些是我的选择:

  1. 在表中为每个变量设置单独的字段并单独评估它们。例如 nameVariable、reprNameVariable,然后我可以使用如下代码构建主体:

    This is an email body containing lots of different variables. Dear #evaluate(nameVariable)#, <br/> Please contact #evaluate(reprNameVariable)# for further details.

  2. 有一个包含所有文本和适用字段名称的“emailBody”字段,并将其写入临时文件并cfinclude 。(正如 Adam Cameron 所建议的,我认为这就是 Sergii 的意思)

  3. 有一个“emailBody”字段并编写代码来循环它,找到所有冷融合变量,并用它们的“评估”版本替换它们。(正如戴尔弗雷泽所建议的)

  4. 有一个小模板文件,每个报告类型一个,带有电子邮件正文,并有一个字段“emailBodyTemplate”指示要包含的模板。(正如亚当卡梅隆所建议的)

现在我只需要决定使用哪一个 :) 当我这样做时,我会接受建议该方法的人的回答(除非它没有被建议,在这种情况下我可能会接受这个,或者如果有人想出了另一种更有意义的方法)

于 2011-11-09T10:38:22.120 回答
0

您使用的是 ColdFusion 9 还是 Railo?如果是,写入并包含内存文件可能是快速简单的解决方案。只需使用类似的东西生成文件名CreateUUID()以避免冲突。

于 2011-11-09T10:02:32.723 回答