1

我在我的应用程序中使用 NVelocity 来生成 html 电子邮件。我的应用程序有一个事件驱动模型,其中保存和/或更新对象会导致这些电子邮件被发送出去。每个事件都可以触发零封、一封或多封电子邮件。

我希望能够配置在运行时发送哪些电子邮件,而无需修改代码。我在想我可以利用 NVelocity #if() 指令来做到这一点。这是我的想法...

步骤 1) 在发送电子邮件之前,管理员必须配置一个公式供 NVelocity 评估。例如:

$User.FirstName == "Jack"

步骤 2) 保存或创建对象时,根据输入公式在内存中构建 NVelocity 模板。例如:

String formula = GetFormulaFromDB(); // $User.FirstName == "Jack"
String templ = "#if( " + formula + ") 1 #else 0 #end";

步骤 3) 针对模板在内存中执行 NVelocity 引擎。检查结果以查看我们是否必须发送电子邮件:

String result = VelocityMerge(templ); // utility function 
if( result.Trim() == "1" )
{
    SendEmail();
}

我知道这并不完全是 NVelocity 的意图,但我认为它可能会起作用 :) 这样做的好处之一是公式可以使用与模板中使用的相同的语法。

有没有人有任何警告或建议?有没有一种方法可以执行 #if() 指令而无需像我上面那样跳过箍?是否有推荐的方法来提前验证公式语法?

谢谢。

4

1 回答 1

1

如果非技术最终用户是更改标准的最终用户,我会非常小心地验证他的输入。VelocityMerge()如果 NVelocity 抱怨您拒绝输入,您可以通过针对输入运行模板(即您的方法)轻松验证它,否则将其保存到数据库中。

正如 serg555 评论的那样,另一个限制是您必须预先知道标准中可能存在的所有变量。一些邮件模板可能需要一个其他邮件不需要的变量,但您仍然必须使其可用于所有模板。这是否是一个真正的限制取决于您的邮件模板的同质性(?)。

此外,定义标准的最终用户必须知道所有可用变量(例如$User)和每个变量的属性(例如 FirstName、LastName 等)。一些列出它们的帮助屏幕,也许。

于 2010-05-14T18:09:35.417 回答