使用Struts2视图发送模板电子邮件

使用Struts2视图发送模板电子邮件,struts2,html-email,apache-tiles,Struts2,Html Email,Apache Tiles,我正在使用Struts2,我想将我的一个操作的html输出作为电子邮件发送。 换句话说,我不想在浏览器中显示输出的html,而是想将其作为电子邮件发送 我正在使用ApacheTiles创建我的页面 编辑: 一般来说,我们能否将struts视图的html结果作为一个流传递给另一个操作?首先,我需要指出,使用JSP作为电子邮件模板不是一个好主意。但是,如果您需要这样做,或者您需要记录用户看到的确切HTML(或任何其他原因),您可以这样做: 为您的操作创建一个拦截器 从ServletActionCon

我正在使用Struts2,我想将我的一个操作的html输出作为电子邮件发送。 换句话说,我不想在浏览器中显示输出的html,而是想将其作为电子邮件发送

我正在使用ApacheTiles创建我的页面

编辑:
一般来说,我们能否将struts视图的html结果作为一个流传递给另一个操作?

首先,我需要指出,使用JSP作为电子邮件模板不是一个好主意。但是,如果您需要这样做,或者您需要记录用户看到的确切HTML(或任何其他原因),您可以这样做:

  • 为您的操作创建一个拦截器
  • 从ServletActionContext获取响应
  • 将响应包装起来
  • 调用操作
  • 获取(甚至更改)响应
  • 返回结果
  • 这是我代码的一部分:


    Struts与streams一起工作,但不清楚您希望如何将流传递给action?从技术上来说,是的,但我几乎可以肯定这不是我会采取的方法。我宁愿电子邮件是用FreeMarker/etc之类的东西构建的,并以这种方式进行处理。@DaveNewton,想象一下,您已经有了该模板的jsp版本,并且您希望给用户发送电子邮件的选项。然后创建一个新模板需要双重维护我理解这个问题。问题是,除非在应用程序容器外有一个JSP引擎,否则以这种方式使用JSP既困难又脆弱。
    import java.io.CharArrayWriter;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    //STEP 1
    public class EmailInterceptor implements Interceptor {
    
        @Override
        public String intercept(ActionInvocation actionInvocation) throws Exception {
            // STEP 2
            HttpServletResponse response = ServletActionContext.getResponse();
            PrintWriter out = response.getWriter();
            // STEP 3
            CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response);
    
            ServletActionContext.setResponse(responseWrapper);
            // STEP 4
            String result = actionInvocation.invoke();
            // STEP 5
            String servletResponse = new String(responseWrapper.toString());
            out.write(servletResponse + "whatever");
            // STEP 6
            return result;
    
        }
    
        public class CharResponseWrapper extends HttpServletResponseWrapper {
            private CharArrayWriter output;
    
            public String toString() {
                return output.toString();
            }
    
            public CharResponseWrapper(HttpServletResponse response) {
                super(response);
                output = new CharArrayWriter();
            }
    
            public PrintWriter getWriter() {
                return new PrintWriter(output);
            }
        }
    
    }