我们有一个应用程序需要发送各种不同类型的模板电子邮件。目前的代码非常繁琐且不够灵活。有没有人能够帮助完成这类工作...我们正在寻找某种形式的电子邮件库。
答案 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处理器为我生成电子邮件内容。
这很简单:
HttpServletResponse
和ServletOutputStream
,它捕获servlet容器写入的内容并将其转换为String,并依赖RequestDispatcher.include(...)
向模板发出“请求” JSP(我还编写了一个自定义HttpServletRequest
来隔离原始请求和突变)。答案 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来处理电子邮件。