envío - java mail example
Sugerencias para la creación de plantillas de correo electrónico Java? (9)
Aquí hay un punto de referencia de la plantilla de Java
tenemos una aplicación que necesita enviar varios tipos diferentes de plantilla de correo electrónico. El código actual es muy engorroso y no muy flexible. ¿Alguien quiere una biblioteca para ayudar con este tipo de trabajo ... Estamos buscando algún tipo de biblioteca de plantillas para correo electrónico.
Hay un example para usar Snippetory para correos electrónicos.
Jack Leow dijo que escribió una HttpServletResponse personalizada para poder reutilizar las JSP para generar plantillas de correo electrónico, hice lo mismo y me gustaría compartir mi muestra / prototipo de código para aquellos que no están seguros de dónde comenzar:
Por lo general, al servir una página JSP, harías algo como esto:
res.setContentType("text/html");
RequestDispatcher jsp = req.getRequestDispatcher("/WEB-INF/templates/" + template);
res.setStatus(200);
jsp.forward(req, res);
Ahora, en lugar de hacer eso jsp.forward a HttpServletResponse, haga un jsp.forward a su Respuesta de servlets personalizada:
EmailServletResponse res2 = new EmailServletResponse();
jsp.forward(req, res2);
System.out.println(res2.toString()); <<-- email gets printed here
Su respuesta de EmailServlet será simplemente una clase que implementa HttpServletResponse, rellene los espacios en blanco y use un StringWriter subyacente para lograr la conversión de 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();
}
}
Siéntase libre de mejorar el código donde sea necesario, esta fue una sesión de creación rápida de prototipos :)
Me encontré con un problema similar hace un año. En nuestro caso, nuestros desarrolladores de front-end estaban familiarizados con JSP, y realmente no quería incluir otro motor de plantillas en la mezcla. Quería algo que dependiera del procesador JSP del contenedor de servlets para generar contenido de correo electrónico para mí.
Es bastante sencillo:
- Tenía que tener una página JSP en mi aplicación (puede ponerla en / WEB-INF si no quiere que sea accesible desde el exterior).
- Escribí un
HttpServletResponse
yServletOutputStream
que capturan el contenido escrito por el contenedor de servlets y lo convierte en String, y confió enRequestDispatcher.include(...)
para hacer una "solicitud" a la plantilla JSP (también escribí unHttpServletRequest
personalizado para aislar la solicitud original de la mutación). - Debido a que este es un truco, y no del modo en que se pretendía utilizar la API de servlet, encapsulé todo esto en una clase de utilidad, de modo que todo el código del cliente tiene que pasar en la ruta a la plantilla JSP, y recuperar el contenido procesado.
Prefiero Freemarker , aquí sobre Velocity. Estoy descubriendo que Freemarker es mucho más simple en este caso. Echa un vistazo a Freemarker vs Velocity .
Si está utilizando Spring, entonces puede estar interesado en usar Velocity o Freemarker con Spring Framework .
Quizás Apache Velocity podría funcionar para usted?
Si le gusta StringTemplate , es posible que le guste developers.google.com/closure/templates StringTemplate . Mejor usabilidad, mejor organización, mejor documentación y mejor soporte, IMO.
También es posible crear un "contenido de correo jsp" como
mails/orderConfirmed.jsp
mails/sendingYourOrderNotification.jsp
simplemente haga una solicitud de cliente http "/mails/*.jsp" para obtener el contenido de correo que desea.
Creo que es un uso justo de jsp ya que desea generar HTML de todos modos, y solicitar su propio servidor no consume ancho de banda.
Lo bueno es que puedes hacer inclusión de jsp, o incluso usar bibliotecas más avanzadas como tiles, jsf, struts, wicket. No necesita aprender una nueva herramienta para eso, puede usar lo que ya sabe. Jsps es un motor de creación de plantillas bastante eficiente, existe desde los años 2000.
Lo malo es que no puedes usar tus variables tipeadas para componer tu jsp, estás limitado a cadenas como parámetros de solicitud (o un buen json enorme :-))
También es una buena forma de aislar el código e incluso dividir servidores más adelante si necesita una optimización del rendimiento.
StringTemplate también es un motor de plantillas muy agradable.