我们有一个应用程序需要发送各种不同类型的模板电子邮件。当前的代码非常繁琐,也不太灵活。有没有人知道可以帮助处理这种工作的库?我们正在寻找一种适用于电子邮件模板的模板库。
StringTemplate 是一个非常不错的模板引擎。
Jack Leow说他编写了一个自定义的HttpServletResponse,以便可以重用JSP来生成电子邮件模板,我也做了同样的事情,并且想分享我的代码示例/原型给那些不确定如何开始的人:
通常在提供JSP页面时,您会执行类似以下操作:
res.setContentType("text/html");
RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template);
res.setStatus(200);
jsp.forward(req, res);
现在,不要将 jsp.forward 转发给 HttpServletResponse,而是将其转发到您的自定义 Servlet Response:
EmailServletResponse res2 = new EmailServletResponse();
jsp.forward(req, res2);
System.out.println(res2.toString()); <<-- email gets printed here
您的EmailServlet响应只需实现HttpServletResponse接口,并填写空白部分,使用底层的StringWriter来完成toString转换:
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();
}
}
如有需要,请随意改进代码。这只是一个快速的原型设计会话 :)
大约一年前,我遇到了类似的问题。在我们的情况下,我们的前端开发人员都熟悉JSP,我真的不想让另一个模板引擎加入到混合中。我想要一些依赖于Servlet容器的JSP处理器来为我生成电子邮件内容的东西。
步骤相对简单:
HttpServletResponse
和ServletOutputStream
,捕获Servlet容器写入的内容并将其转换成字符串,并依靠RequestDispatcher.include(...)
向模板JSP发送“请求”(我还编写了一个自定义的HttpServletRequest
以隔离原始请求免受变异的影响)。我更喜欢Freemarker,而不是Velocity;在我看来,这种情况下Freemarker要简单得多。
如果你正在使用Spring,那么你可能对Spring MVC中的Freemarker感兴趣。
mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp