使用Struts2 View发送模板电子邮件

时间:2015-02-13 17:30:04

标签: struts2 html-email apache-tiles

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

我使用Apache Tiles来创建我的页面。

编辑: 通常,我们可以将struts视图的html结果作为流获取并将其传递给另一个动作吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 为您的操作创建拦截器
  2. 从ServletActionContext获取响应
  3. 回复回复
  4. 调用操作
  5. 获得(甚至更改)响应。
  6. 返回结果。
  7. 这是我的代码的一部分:

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