我在我的应用程序中使用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()指令而不像上面那样跳过箍?是否有建议的方法提前验证公式语法?
感谢。
答案 0 :(得分:1)
如果非技术最终用户是更改标准的用户,我会非常小心地验证他的输入。如果NVelocity抱怨您拒绝输入,则可以通过针对输入运行模板(即VelocityMerge()
方法)轻松验证它,否则将其保存到数据库中。
另一个限制是,您必须事先知道标准中可能出现的所有变量,如serg555所评论的那样。某些邮件模板可能需要一个其他邮件无需的变量,但您仍然需要将其提供给所有模板。这是否真正的限制取决于您的邮件模板的同质性(?)。
定义标准的最终用户还必须知道所有可用变量(例如$User
)和每个变量的属性(例如FirstName,LastName等)。可能会有一些帮助屏幕列出它们。