web-dev-qa-db-ja.com

Javaメールテンプレート?

さまざまな種類のテンプレートメールを送信する必要があるアプリケーションがあります。現在のコードは非常に扱いにくく、柔軟性に欠けています。このタイプの作業を支援するライブラリの1つを知っていますか...電子メール用のテンプレートライブラリを探しています。

40
J. Scarbrough

StringTemplate も非常に素晴らしいテンプレートエンジンです。

23
Dave Ray

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

必要に応じてコードを自由に改善してください。これは簡単なプロトタイプ作成セッションでした:)

23

おそらく Apache Velocity はあなたのために働くでしょうか?

23
javamonkey79

約1年前に同様の問題に遭遇しました。私たちの場合、フロントエンドの開発者はすべてJSPに精通していたため、別のテンプレートエンジンを混在させたくはありませんでした。電子メールコンテンツを生成するために、サーブレットコンテナのJSPプロセッサに依存するものが必要でした。

それはかなり簡単です:

  1. アプリケーションにJSPページが必要でした(外部からアクセスしたくない場合は、/ WEB-INFに配置できます)。
  2. サーブレットコンテナによって書き込まれたコンテンツをキャプチャし、それを文字列に変換するカスタムHttpServletResponseおよびServletOutputStreamを作成し、RequestDispatcher.include(...)に依存して、テンプレートJSP(元のリクエストを突然変異から分離するために、カスタムHttpServletRequestも作成しました)。
  3. これはちょっとしたハックであり、サーブレットAPIの使用方法ではないため、これをすべてユーティリティクラスにカプセル化しました。そのため、クライアントコードは、JSPテンプレートへのパスを渡すだけで済みます。処理されたコンテンツを取得します。
18
Jack Leow

Freemarker 、ここではVelocityよりも好きです。 imo、この場合はFreemarkerの方がはるかに簡単です。

Springを使用している場合は、 Spring MVCのFreemarker に興味があるかもしれません。

14
Adeel Ansari
6
Name is carl

StringTemplate が好きな人は Google Soy がいいかもしれません。使いやすさ、編成、文書化、サポートの向上、IMO。

3
Rich Apodaca

次のような「メールコンテンツjsp」を作成することもできます。

mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp

次に、httpクライアントリクエスト「/mails/*.jsp」を実行して、必要なメールコンテンツを取得します。

とにかくHTMLを生成したいのでjspの公正な使用であり、独自のサーバーを要求することは帯域幅を消費しません。

良いことは、jspを含めることができ、さらにタイル、jsf、struts、wicketなどのより高度なライブラリを使用できることです。そのための新しいツールを学ぶ必要はありません。すでに知っていることを使用できます。 Jspは非常にパフォーマンスの高いテンプレートエンジンであり、2000年から存在しています。

悪い点は、型付き変数を使用してjspを作成できないことです。リクエストパラメータとして文字列に制限されます(または、巨大なjsonになります:-))

また、パフォーマンスの最適化が必要な場合は、コードを分離したり、後でサーバーを分割することもできます。

2
Zied Hamdi

電子メールにスニペットを使用する があります。

0
Sir RotN