我有各种代表电子邮件的Velocity模板文件。我正在寻找一种优雅的方式来允许模板文件输出消息的主题行以及内容。我考虑过几个选择:
使输出的第一行类似于“Subject:Bla”并在Java中将其删除。我拒绝这种方法,因为从Java执行花哨的字符串操作正是我试图通过首先使用Velocity来解决的问题。
将一个可设置对象放入Velocity宏中某些代码的映射中以调用setter。优点:非常简单。缺点:我不喜欢从Velocity设置外部对象的想法,即使只是一种输出形式。不过,这可能是一种不合理的厌恶。
创建一些自定义Velocity命令,例如#setSubjectLine。优点:更优雅。缺点:将作为有效命令应用于我的所有模板,无论它们是否是电子邮件。
为主题行和电子邮件的其余部分分别提供模板文件。亲:没有特别的伎俩! Con:并非所有的电子邮件逻辑都存在于同一个地方。
我不知道的一些很酷的Velocity技巧。
???
那我该怎么办?你对5或6有什么建议吗?我应该选择1,2,3或4的原因?
答案 0 :(得分:3)
2)将一个可设置的对象抛出到Velocity宏中的某些代码的映射中以调用setter。优点:非常简单。缺点:我不喜欢从Velocity设置外部对象的想法,即使只是一种输出形式。不过,这可能是一种不合理的厌恶。
这是我的方法,尽管我最初有类似的疑虑,但我很满意。我甚至用这种方式设置字符编码和其他属性。这会将模板的其余部分保留为邮件正文。再一次,我很高兴。
#set ( $myAtts.encoding = "utf-8" )
#set ( $myAtts.from = "stu@nowhere.net" )
答案 1 :(得分:1)
在$work
,我们做了4.它工作正常,反对并非生活在同一个地方的所有电子邮件逻辑的论点似乎有点过于严格。你只需要两个速度文件相邻。即使只有一个模板文件,您仍然可以使用逻辑来填充数据,确定收件人,附加附件等,这些也不会存在于Velocity文件中。
我更喜欢2比3,因为我不喜欢Velocity宏。使用Java对象似乎更灵活。
$mailContext.setSubjectLine($subject)
使用2或3,您可以更接近将目标放在一个地方的目标:例如,您也可以让Velocity设置收件人列表。另一方面,这似乎与Velocity是一种纯粹的模板技术的想法相冲突。
这里要考虑的是谁在编写Velocity模板。它越接近“最终用户”,你就越不想麻烦他们(并防止他们搞乱)与创建电子邮件内容没有直接关系的任何事情。
不确定这是否可行,有意义,甚至可能使用Java Mail API,但仅仅是为了完整性:
6.使用velocity创建包含标题的整个电子邮件,而不仅仅是内容和主题。区别在于您不需要对此输出进行后处理,它可以直接转到邮件传输代理。可能不适用于附件。
To: $to
CC: $cc
Subject: $subject
Here comes the content.