Java电子邮件模板的建议?

时间:2009-01-18 23:50:08

标签: java email frameworks templates

我们有一个应用程序需要发送各种不同类型的模板电子邮件。目前的代码非常繁琐且不够灵活。有没有人能够帮助完成这类工作...我们正在寻找某种形式的电子邮件库。

9 个答案:

答案 0 :(得分:22)

也许Apache Velocity可能适合你?

答案 1 :(得分:22)

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,而是将jsp.forward执行到自定义Servlet响应:

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();
}
}

随意改进代码,这是一个快速的原型设计会议:)

答案 2 :(得分:21)

StringTemplate也是一个非常好的模板引擎。

答案 3 :(得分:18)

一年前我遇到了类似的问题。在我们的例子中,我们的前端开发人员都熟悉JSP,我真的不想将另一个模板引擎添加到组合中。我想要依赖servlet容器的JSP处理器为我生成电子邮件内容。

这很简单:

  1. 我必须在我的应用程序中有一个JSP页面(如果你不希望它可从外部访问,你可以把它放在/ WEB-INF中。)
  2. 我编写了一个自定义HttpServletResponseServletOutputStream,它捕获servlet容器写入的内容并将其转换为String,并依赖RequestDispatcher.include(...)向模板发出“请求” JSP(我还编写了一个自定义HttpServletRequest来隔离原始请求和突变)。
  3. 因为这有点像hack,而不是servlet API的使用方式,所以我将所有这些封装在一个实用程序类中,因此所有客户端代码所要做的就是将路径传递给JSP模板,并获取已处理的内容。

答案 4 :(得分:14)

我更喜欢Freemarker,而不是Velocity; imo,Freemarker在这种情况下更简单。

如果您使用Spring,那么您可能会感兴趣,Freemarker in Spring MVC

答案 5 :(得分:6)

答案 6 :(得分:3)

如果您喜欢StringTemplate,您可能会更喜欢Google Soy。更好的可用性,更好的组织,更好的文档,以及更好的支持,IMO。

答案 7 :(得分:2)

还可以创建一个&#34;邮件内容jsp&#34;喜欢

mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp

然后只需做一个http客户端请求&#34; / mails / * .jsp&#34;获取您想要的邮件内容。

我认为它是jsp的合理使用,因为你想要生成HTML,并且请求你自己的服务器不会占用带宽。

好处是你可以做jsp包含,甚至使用更高级的库,如tiles,jsf,struts,wicket。你不需要为此学习新工具,你可以使用你已经知道的东西。 Jsps是一个性能非常好的模板引擎,它们自2000年以来一直存在。

不好的一点是你不能使用你输入的变量来组成你的jsp,你只限于字符串作为请求参数(或者一个好的巨大的json: - ))

如果您需要性能优化,它也是隔离代码甚至以后拆分服务器的好方法。

答案 8 :(得分:0)

有一个example可以使用Snippetory来处理电子邮件。