Java电子邮件模板的建议?
我们有一个应用程序,需要发送各种不同类型的模板电子邮件。当前的代码非常繁琐,也不是很灵活。有没有人知道图书馆能帮你做这类工作。。。我们正在寻找某种电子邮件模板库。也许可以为您工作?也是一个非常好的模板引擎。我更喜欢这里,而不是Velocity;依我看,Freemarker在这种情况下要简单得多Java电子邮件模板的建议?,java,email,frameworks,templates,Java,Email,Frameworks,Templates,我们有一个应用程序,需要发送各种不同类型的模板电子邮件。当前的代码非常繁琐,也不是很灵活。有没有人知道图书馆能帮你做这类工作。。。我们正在寻找某种电子邮件模板库。也许可以为您工作?也是一个非常好的模板引擎。我更喜欢这里,而不是Velocity;依我看,Freemarker在这种情况下要简单得多 如果您使用的是Spring,那么您可能会对它感兴趣。大约一年前,我遇到了类似的问题。在我们的例子中,我们的前端开发人员都熟悉JSP,我真的不想在混合中加入另一个模板引擎。我想要一些依赖servlet容器的
如果您使用的是Spring,那么您可能会对它感兴趣。大约一年前,我遇到了类似的问题。在我们的例子中,我们的前端开发人员都熟悉JSP,我真的不想在混合中加入另一个模板引擎。我想要一些依赖servlet容器的JSP处理器为我生成电子邮件内容的东西 这相当简单:
HttpServletResponse
和ServletOutputStream
,它捕获servlet容器编写的内容并将其转换为字符串,并依赖RequestDispatcher.include(…)
向模板JSP发出“请求”(我还编写了一个定制的HttpServletRequest
,以将原始请求与变异隔离开来)如果你喜欢,你可能会更喜欢。更好的可用性,更好的组织,更好的文档,更好的支持,我想。有一个电子邮件使用Snippetory。Jack Leow说他写了一个定制的HttpServletResponse,这样他就可以重复使用JSP生成电子邮件模板,我也这么做了,并想分享我的代码sample/原型适用于不确定从何处开始的用户: 通常在为JSP页面提供服务时,您会执行以下操作:
res.setContentType("text/html");
RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template);
res.setStatus(200);
jsp.forward(req, res);
现在,不要执行jsp.forward to HttpServletResponse,而是执行jsp.forward to您的自定义Servlet响应:
EmailServletResponse res2 = new EmailServletResponse();
jsp.forward(req, res2);
System.out.println(res2.toString()); <<-- email gets printed here
如果需要,请随意改进代码,这是一个快速原型会话:)也可以创建“邮件内容jsp”,如 然后只需执行http客户端请求“/mails/*.jsp”即可获得所需的邮件内容 我认为这是jsp的合理使用,因为您无论如何都希望生成HTML,并且请求您自己的服务器不会占用带宽 好的方面是,您可以进行jsp包含,甚至可以使用更高级的库,如tiles、jsf、struts和wicket。你不需要学习新的工具,你可以使用你已经知道的。JSP是一个非常高效的模板引擎,自2000年以来就存在了 缺点是不能使用类型化变量来编写jsp,只能使用字符串作为请求参数(或一个好的大型json:-) 如果需要性能优化,这也是隔离代码甚至稍后拆分服务器的好方法 这里有一个
+1我以前使用过Velocity+Spring,我也是。(速度,而不是弹簧)打得好。作为补充说明,您可能希望在将主题/正文内容传递到类似JavaMail的API之前进行替换。否则,由于编码或换行问题,您可能最终生成无效的EML文件。非常简单,但我们的情况灵活。但是,哦!这是一个多么可怕的网站啊。反馈表坏了。它也不在Maven中。Java文化中有什么东西可以把东西放在一起,让它们看起来很糟糕,并期望人们“使用”它们?将Django(基于python的项目)文档与任何java产品的文档进行比较。我很失望。我将使用Velocity——尽管它有副作用,但它过于臃肿,可能更糟。如果你需要通过maven导入它,你可以在这里找到它:如果你喜欢StringTemplate,你可能会更喜欢谷歌大豆模板:还有,drozzy说了什么。你是从一个例子中工作的吗?我非常喜欢使用JSP模板的想法。不,这是我在以前的工作中想到的。不幸的是,我再也无法访问代码了。请看这里的代码示例,它实际上相当简单:如果您不想将jar添加到项目中,这可能非常有用:这是我的情况,因为我使用GAE,每个添加的jar都会增加实例启动的权重。因此,感谢您的提示,我不是自己来的:)PS,而是使用HttpServletResponseWrapper如果您使用控制器或servlet处理JSP,那么您可以使用请求参数加载完整对象以在JSP中使用是的,但是如果您计划稍后将邮件服务器与应用程序的其余部分分离,我建议您避免这样做(特别是现在我们总是有个性化的邮件:因为你必须插入带有客户id的unsubscribe链接,你可以用她的名字等称呼对方。因此,可能会有与邮件活动一样多的jsp处理(至少数千个)。在同一个“main”上完成该任务服务器可能会降低前端性能+1,因为Freemarker在允许的范围内比Velocity严格一点。
public class EmailServletResponse implements HttpServletResponse {
private int status;
private StringWriter sw = new StringWriter();
@Override
public void flushBuffer() throws IOException {
sw.flush();
}
@Override
public int getBufferSize() {
return 1024;
}
@Override
public String getCharacterEncoding() {
return "UTF-8";
}
@Override
public String getContentType() {
return "text/html";
}
@Override
public Locale getLocale() {
return Locale.getDefault();
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
sw.write(b);
}
};
}
@Override
public PrintWriter getWriter() throws IOException {
PrintWriter pw = new PrintWriter(sw);
return pw;
}
@Override
public boolean isCommitted() {
return false;
}
@Override
public void reset() {
}
@Override
public void resetBuffer() {
}
@Override
public void setBufferSize(int arg0) {
}
@Override
public void setCharacterEncoding(String arg0) {
}
@Override
public void setContentLength(int arg0) {
}
@Override
public void setContentType(String arg0) {
}
@Override
public void setLocale(Locale arg0) {
}
@Override
public void addCookie(Cookie arg0) {
}
@Override
public void addDateHeader(String arg0, long arg1) {
}
@Override
public void addHeader(String arg0, String arg1) {
}
@Override
public void addIntHeader(String arg0, int arg1) {
}
@Override
public boolean containsHeader(String arg0) {
return false;
}
@Override
public String encodeRedirectURL(String arg0) {
return "";
}
@Override
public String encodeRedirectUrl(String arg0) {
return "";
}
@Override
public String encodeURL(String arg0) {
return "";
}
@Override
public String encodeUrl(String arg0) {
return "";
}
@Override
public void sendError(int arg0) throws IOException {
}
@Override
public void sendError(int arg0, String arg1) throws IOException {
}
@Override
public void sendRedirect(String arg0) throws IOException {
}
@Override
public void setDateHeader(String arg0, long arg1) {
}
@Override
public void setHeader(String arg0, String arg1) {
}
@Override
public void setIntHeader(String arg0, int arg1) {
}
@Override
public void setStatus(int status) {
this.status = status;
}
@Override
public void setStatus(int status, String message) {
setStatus(status);
}
public String toString(){
return sw.getBuffer().toString();
}
}
mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp