Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java电子邮件模板的建议?_Java_Email_Frameworks_Templates - Fatal编程技术网

Java电子邮件模板的建议?

Java电子邮件模板的建议?,java,email,frameworks,templates,Java,Email,Frameworks,Templates,我们有一个应用程序,需要发送各种不同类型的模板电子邮件。当前的代码非常繁琐,也不是很灵活。有没有人知道图书馆能帮你做这类工作。。。我们正在寻找某种电子邮件模板库。也许可以为您工作?也是一个非常好的模板引擎。我更喜欢这里,而不是Velocity;依我看,Freemarker在这种情况下要简单得多 如果您使用的是Spring,那么您可能会对它感兴趣。大约一年前,我遇到了类似的问题。在我们的例子中,我们的前端开发人员都熟悉JSP,我真的不想在混合中加入另一个模板引擎。我想要一些依赖servlet容器的

我们有一个应用程序,需要发送各种不同类型的模板电子邮件。当前的代码非常繁琐,也不是很灵活。有没有人知道图书馆能帮你做这类工作。。。我们正在寻找某种电子邮件模板库。

也许可以为您工作?

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

我更喜欢这里,而不是Velocity;依我看,Freemarker在这种情况下要简单得多


如果您使用的是Spring,那么您可能会对它感兴趣。

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

这相当简单:

  • 我的应用程序中必须有一个JSP页面(如果不希望外部访问,可以将其放在/WEB-INF中)
  • 我编写了一个定制的
    HttpServletResponse
    ServletOutputStream
    ,它捕获servlet容器编写的内容并将其转换为字符串,并依赖
    RequestDispatcher.include(…)
    向模板JSP发出“请求”(我还编写了一个定制的
    HttpServletRequest
    ,以将原始请求与变异隔离开来)
  • 因为这是一个小技巧,而不是ServletAPI的预期使用方式,所以我将所有这些封装在一个实用程序类中,以便所有客户机代码所要做的就是将路径传递到JSP模板,并返回处理过的内容

  • 如果你喜欢,你可能会更喜欢。更好的可用性,更好的组织,更好的文档,更好的支持,我想。

    有一个电子邮件使用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