さまざまな種類のテンプレートメールを送信する必要があるアプリケーションがあります。現在のコードは非常に扱いにくく、柔軟性に欠けています。このタイプの作業を支援するライブラリの1つを知っていますか...電子メール用のテンプレートライブラリを探しています。
StringTemplate も非常に素晴らしいテンプレートエンジンです。
Jack Leow氏は、メールテンプレートの生成にJSPを再利用できるようにカスタムHttpServletResponseを書いたと言いました。私も同じことをしました。
通常、JSPページを提供するときは、次のようなことをします。
res.setContentType("text/html");
RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template);
res.setStatus(200);
jsp.forward(req, res);
HttpServletResponseに対してjsp.forwardを実行する代わりに、カスタムServlet Responseに対してjsp.forwardを実行します。
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();
}
}
必要に応じてコードを自由に改善してください。これは簡単なプロトタイプ作成セッションでした:)
おそらく Apache Velocity はあなたのために働くでしょうか?
約1年前に同様の問題に遭遇しました。私たちの場合、フロントエンドの開発者はすべてJSPに精通していたため、別のテンプレートエンジンを混在させたくはありませんでした。電子メールコンテンツを生成するために、サーブレットコンテナのJSPプロセッサに依存するものが必要でした。
それはかなり簡単です:
HttpServletResponse
およびServletOutputStream
を作成し、RequestDispatcher.include(...)
に依存して、テンプレートJSP(元のリクエストを突然変異から分離するために、カスタムHttpServletRequest
も作成しました)。Freemarker 、ここではVelocityよりも好きです。 imo、この場合はFreemarkerの方がはるかに簡単です。
Springを使用している場合は、 Spring MVCのFreemarker に興味があるかもしれません。
StringTemplate が好きな人は Google Soy がいいかもしれません。使いやすさ、編成、文書化、サポートの向上、IMO。
次のような「メールコンテンツjsp」を作成することもできます。
mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp
次に、httpクライアントリクエスト「/mails/*.jsp」を実行して、必要なメールコンテンツを取得します。
とにかくHTMLを生成したいのでjspの公正な使用であり、独自のサーバーを要求することは帯域幅を消費しません。
良いことは、jspを含めることができ、さらにタイル、jsf、struts、wicketなどのより高度なライブラリを使用できることです。そのための新しいツールを学ぶ必要はありません。すでに知っていることを使用できます。 Jspは非常にパフォーマンスの高いテンプレートエンジンであり、2000年から存在しています。
悪い点は、型付き変数を使用してjspを作成できないことです。リクエストパラメータとして文字列に制限されます(または、巨大なjsonになります:-))
また、パフォーマンスの最適化が必要な場合は、コードを分離したり、後でサーバーを分割することもできます。
電子メールにスニペットを使用する 例 があります。