Sugestie dotyczące szablonów poczty Java? [zamknięte]

Mamy aplikację, która musi wysyłać różne rodzaje szablonów wiadomości e-mail. Obecny kod jest bardzo uciążliwy i mało elastyczny. Czy każdy konw z biblioteki, aby pomóc w tego typu pracy... Szukamy jakiejś biblioteki szablonów dla poczty e-mail.

Author: J. Scarbrough, 2009-01-19

9 answers

StringTemplate jest również bardzo ładnym silnikiem szablonów.

 18
Author: Dave Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-21 07:13:30

Być może Apache Velocity mógłby ci pomóc?

 21
Author: javamonkey79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-10 08:13:26

Jack Leow powiedział, że napisał Niestandardowy HttpServletResponse, aby mógł ponownie użyć JSPs do generowania szablonów e-mail, po prostu zrobiłem to samo i chciałbym udostępnić mój przykładowy kod / prototyp dla tych, którzy nie wiedzą, od czego zacząć: {]}

Zazwyczaj podczas serwowania strony JSP, można zrobić coś takiego:

res.setContentType("text/html");
RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template);
res.setStatus(200);
jsp.forward(req, res);

Teraz zamiast robić to jsp.prześlij do HttpServletResponse, wykonaj jsp.prześlij do swojej niestandardowej odpowiedzi na Servlet:

EmailServletResponse res2 = new EmailServletResponse();
jsp.forward(req, res2);
System.out.println(res2.toString()); <<-- email gets printed here

Twoja odpowiedź na EmailServlet będzie po prostu klasa, która implementuje HttpServletResponse, wypełnia puste pola i używa podstawowego Stringwritera do wykonania konwersji 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();
}
}

Nie krępuj się, aby poprawić kod w razie potrzeby, to była szybka sesja prototypowania:)

 21
Author: Jan Vladimir Mostert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-30 21:13:35

Miałem podobny problem jakiś rok temu. W naszym przypadku wszyscy nasi programiści byli zaznajomieni z JSP i naprawdę nie chciałem dodawać do tego innego silnika szablonów. Chciałem coś, co opierało się na procesorze JSP servlet container do generowania treści e-mail dla mnie.

To dość proste:

  1. musiałem mieć stronę JSP w mojej aplikacji(możesz umieścić ją w /WEB-INF, jeśli nie chcesz, aby była dostępna zewnętrznie).
  2. I wrote a custom HttpServletResponse i ServletOutputStream, które przechwytują zawartość napisaną przez kontener servleta i zamieniają ją w ciąg znaków, i polegają na RequestDispatcher.include(...), aby złożyć" żądanie " do szablonu JSP (napisałem również custom HttpServletRequest, aby odizolować pierwotne żądanie od mutacji).
  3. ponieważ jest to trochę hack, a nie sposób API servlet miał być używany, zamknąłem to wszystko w klasie użytkowej, tak, że wszystko, co kod klienta musi zrobić, to przejść w ścieżce do szablonu JSP, i odzyskać przetworzone treść.
 18
Author: Jack Leow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 08:34:55

Wolę Freemarker , tutaj ponad prędkość. Uważam Freemarker za znacznie prostszy w tym przypadku. Sprawdź Freemarker vs Velocity.

Jeśli używasz Springa, możesz być zainteresowany używaniem Velocity lub Freemarker z frameworkiem Spring.

 12
Author: Adeel Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 04:04:40
 6
Author: Name is carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-30 07:39:30

Jeśli lubisz StringTemplate , możesz polubić Google Soy lepiej. Lepsza użyteczność, lepsza organizacja, lepsza dokumentacja i lepsze wsparcie, IMO.

 3
Author: Rich Apodaca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-02 21:39:08

Możliwe jest również utworzenie "mail content jsp" jak

mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp

Następnie po prostu wykonaj żądanie klienta http " / mails/*.jsp", aby uzyskać żądaną zawartość poczty.

Myślę, że jest to uczciwe użycie jsp, ponieważ i tak chcesz wygenerować HTML, a żądanie własnego serwera nie zużywa przepustowości.

Dobrą rzeczą jest to, że możesz włączyć jsp, a nawet użyć bardziej zaawansowanych bibliotek, takich jak tiles, jsf, struts, wicket. Nie musisz uczyć się nowego narzędzia do tego, możesz użyj tego, co już wiesz. JSP są dość wydajnym silnikiem szablonów, istnieją od lat 2000.

Złe jest to, że nie możesz użyć wpisanych zmiennych do komponowania jsp, jesteś ograniczony do ciągów jako parametrów żądania (lub dobrego ogromnego json: -))

Jest to również dobry sposób na izolowanie kodu, a nawet dzielenie serwerów później, jeśli potrzebujesz optymalizacji wydajności.

 1
Author: Zied Hamdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-26 11:21:59

Istnieje Przykład aby użyć Snippetory dla wiadomości e-mail.

 0
Author: Sir RotN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-12 14:39:41