Подтвердить что ты не робот

Предложения по шаблонам электронной почты Java?

У нас есть приложение, которое должно отправлять различные типы шаблонов электронной почты. Текущий код очень громоздкий и не очень гибкий. Кто-нибудь из библиотеки, чтобы помочь в этом типе работы... Мы ищем какую-то библиотеку шаблонов для электронной почты.

4b9b3361

Ответ 1

StringTemplate также очень хороший механизм шаблонов.

Ответ 2

Возможно, Apache Velocity может сработать для вас?

Ответ 3

Джек Лео сказал, что написал пользовательский HttpServletResponse, чтобы он мог повторно использовать JSP для создания шаблонов электронной почты, я просто сделал то же самое и хотел бы поделиться своим примером/прототипом кода для тех, кто не уверен, с чего начать:

Обычно, когда вы обслуживаете страницу JSP, вы делаете что-то вроде этого:

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

Теперь вместо того, чтобы сделать это jsp.forward для HttpServletResponse, сделайте jsp.forward для вашего пользовательского ответа Servlet:

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

Не стесняйтесь улучшать код, где это необходимо, это был быстрый сеанс прототипирования:)

Ответ 4

Я столкнулся с аналогичной проблемой около года назад. В нашем случае разработчики нашего интерфейса были знакомы с JSP, и я действительно не хотел бросать в систему еще один шаблонный движок. Я хотел что-то, что полагалось на процессор JSP-контейнера сервлета, чтобы генерировать для меня содержимое электронной почты.

Это довольно просто:

  • Мне пришлось иметь JSP-страницу в моем приложении (вы можете поместить ее в /WEB -INF, если вы не хотите, чтобы она была доступна извне).
  • Я написал пользовательские HttpServletResponse и ServletOutputStream, которые захватывают содержимое, написанное контейнером сервлета, и превращают его в String, и полагаются на RequestDispatcher.include(...), чтобы сделать "запрос" к шаблону JSP (я также написал custom HttpServletRequest, чтобы изолировать исходный запрос от мутации).
  • Поскольку это немного взломать, а не то, как должен был использоваться API сервлета, я инкапсулировал все это в класс утилиты, так что все, что нужно сделать клиенту, это пройти по пути к JSP и вернуть обработанный контент.

Ответ 7

Если вам нравится StringTemplate, вам может понравиться Google Soy лучше. Более удобное использование, более организованная, улучшенная документация и более эффективная поддержка, ИМО.

Ответ 8

Также возможно создать "почтовый контент jsp", например

mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp

то просто попросите http-запрос "/mails/*.jsp" получить нужный почтовый контент.

Я думаю, что это справедливое использование jsp, так как вы хотите генерировать HTML в любом случае, и запрос на ваш собственный сервер не требует использования полосы пропускания.

Хорошо, что вы можете включить jsp или использовать более сложные библиотеки, такие как плитки, jsf, struts, wicket. Вам не нужно изучать новый инструмент для этого, вы можете использовать то, что уже знаете. Jsps - довольно эффективный механизм шаблонов, они существуют с 2000 года.

Плохая точка заключается в том, что вы не можете использовать свои типизированные переменные для составления вашего jsp, вы ограничены строками в качестве параметров запроса (или хорошим огромным json: -))

Это также хороший способ изолировать код и даже разделить серверы позже, если вам нужна оптимизация производительности.

Ответ 9

Существует example, чтобы использовать Snippetory для электронных писем.