mail example envío enviar correos correo autenticar archivo adjunto java email frameworks templates

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:

  1. 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).
  2. Escribí un HttpServletResponse y ServletOutputStream que capturan el contenido escrito por el contenedor de servlets y lo convierte en String, y confió en RequestDispatcher.include(...) para hacer una "solicitud" a la plantilla JSP (también escribí un HttpServletRequest personalizado para aislar la solicitud original de la mutación).
  3. 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.




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.