El API JavaMail es un extensión estándar de Java. Proporciona una método estrictamente independiente del protocolo de enviar y recibir emails. La arquitectura de capas de JavaMail permite el uso de varios protocolos de acceso a mensajes, como POP3 e IMAP, y protocolos de transferencia de mensajes como SMTP. JavaMail Interactúa con el contenido de los mensajes a través del "JavaBeans Activation Framework" (JAF). JAF proporciona una forma uniforme de determinar el tipo de mensaje y su encapsularlo. Para más información puedes ver JavaBeans Activation Framework, en la site de Sun
Las "JavaServer Pages" (JSP) permiten a los desarrolladores crear páginas dinámicas ricas en contenido rápida y fácilmente. JSP utiliza etiquetas al estilo de XML para encapsular la lógica que genera el contenido web. Las páginas JSP separan la lógica de la página de su diseño y estructura, lo que evita el solapamiento de roles entre los diseñadores web y los programadores. Los diseñadores diseñan las páginas web y los programadores les añaden la lógica y el código. Para más información puedes ver Servlets y JSP
Este artÃculo explora las posibilidades de combinar estas dos tecnologÃas y crear una aplicación email desplegable en la web que use el API JavaMail y librerÃas de etiquetas JSP para su presentación. Las páginas JSP están pensadas para proporcionar un "método declarativo y céntrico de presentación del desarrollo de servlets". Un página JSP ideal no contiene ninguna lÃnea de código o scriptles. En su lugar la funcionalidad y la lógica del negocio se ejecutan en etiquetas que o están definidas en el API o en librerÃas de etiquetas personalizadas. La aplicación "Email Web Application" (EWA) presentada en este artÃculo usa una librerÃa de etiquetas personalizadas. Las etiquetas están implementadas usando el API JavaMail.
Especificación Funcional
EWA soporta las funcionalidades básicas de una aplicación email. como chequeo de login y envÃo de email. Más especÃficamente, se soportan las siguientes funcionalidades:
- Login en un servidor IMAP
- Listar todos los mensajes en la carpeta INBOX
- Ver los mensajes seleccionados
- Recuperar y ver los attachments de los mensajes seleccionados
- Componer y enviar mensajes
Arquitectura de la Aplicación
EWA es una aplicación web de tres capas. Reside en un servidor de aplicaciones web que interactúa con el servidor correo IMAP. Los clientes son páginas web generadas por páginas JSP desarrolladas en un entorno JSP/Servlet.

EWA utiliza una patrón de diseño derivado de "Model-View-Controller" (MVC). En el paradigma MVC, la entrada del usuario, el modelado del mundo exterior y la realimentación visual al usuario son explÃcitamente separados y manejados por tres tipos de objetos, cada uno especializado en su propia tarea.
La vista trabaja la salida gráfica y/o textual de la porción de pantalla mapeada que está asignada a esta aplicación. El controlador interpreta las entradas del usuario a través del ratón y del teclado, ordenando al modelo y/o la vista que se modifiquen de la forma apriada. Finalmente, el modelo maneja el comportamiento y los datos de la aplicación dominante, responde a las peticiones de información sobre su estado (normalmente desde la vista), y responde a las instrucciones de cambio de estado (normalmente desde el controlador).

En esta aplicación, el modelo consiste en el mensaje IMAP almacenado en el MailUserBean, la librerÃa de etiquetas y el AttachmentServlet, que accede/maneja el almacenamiento del mensaje. La vista consta de componentes HTML y JSP que proporcionan el interface de usuario. El controlador es el FilterServlet, que valida el estado del login del usuario.
El Modelo
MailUserBean
Este es el JavaBean que almacena la información de email del usuario, como el hostname, el username, la password, la session y el protocol. Tiene métodos para obtener y almacenar estos parámetros. Para propósitos de esta demostración el protocolo ha sido codificado para ser IMAP. Este bean implementa los métodos login y logout del usuario. Usa los objetos Session y Store de mail para almacenar la combinación de hostname, username y password
import java.util.*; import javax.mail.*; /** * This JavaBean is used to store mail user information. */ public class MailUserBean { private Folder folder; private String hostname; private String username; private String password; private Session session; private Store store; private URLName url; private String protocol = "imap"; private String mbox = "INBOX"; public MailUserBean(){} /** * Returns the javax.mail.Folder object. */ public Folder getFolder() { return folder; } /** * Returns the number of messages in the folder. */ public int getMessageCount() throws MessagingException { return folder.getMessageCount(); } /** * hostname getter method. */ public String getHostname() { return hostname; } /** * hostname setter method. */ public void setHostname(String hostname) { this.hostname = hostname; } /** * username getter method. */ public String getUsername() { return username; } /** * username setter method. */ public void setUsername(String username) { this.username = username; } /** * password getter method. */ public String getPassword() { return password; } /** * password setter method. */ public void setPassword(String password) { this.password = password; } /** * session getter method. */ public Session getSession() { return session; } /** * session setter method. */ public void setSession(Session s) { this.session = session; } /** * store getter method. */ public Store getStore() { return store; } /** * store setter method. */ public void setStore(Store store) { this.store = store; } /** * url getter method. */ public URLName getUrl() { return url; } /** * Method for checking if the user is logged in. */ public boolean isLoggedIn() { return store.isConnected(); } /** * Method used to login to the mail host. */ public void login() throws Exception { url = new URLName(protocol, getHostname(), -1, mbox, getUsername(), getPassword()); Properties props = System.getProperties(); session = Session.getInstance(props, null); store = session.getStore(url); store.connect(); folder = session.getFolder(url); folder.open(Folder.READ_WRITE); } /** * Method used to login to the mail host. */ public void login(String hostname, String username, String password) throws Exception { this.hostname = hostname; this.username = username; this.password = password; login(); } /** * Method used to logout from the mail host. */ public void logout() throws MessagingException { folder.close(false); store.close(); store = null; session = null; } }
LibrerÃa de Etiquetas
La librerÃa de etiquetas contiene las siguientes etiquetas personalizadas:
- message: usada para leer un mensaje, clases controladoras: MessageTag.java, MessageTEI.java
- listmessages: usada para iterar a través de la lista de mensajes, clases controladoras: ListMessagesTag.java, ListMessagesTEI.java
- sendmail: usada para enviar mensajes, clase controladora: SendTag.java
El fichero descriptor de etiquetas define el nombre de la etiqueta, su clase(o clases) controladoras, atributos, contenidos del cuerpo, etc. Por ejemplo, este fichero "taglig.tld" define todas las etiquetas de esta aplicación:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>javamail</shortname> <uri>http://java.sun.com/products/javamail/demo/webapp</uri> <tag> <name>listattachments</name> <tagclass>ListAttachmentsTag</tagclass> <teiclass>ListAttachmentsTEI</teiclass> <bodycontent>JSP</bodycontent> <info> A listattachments tag </info> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>messageinfo</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>listmessages</name> <tagclass>ListMessagesTag</tagclass> <teiclass>ListMessagesTEI</teiclass> <bodycontent>JSP</bodycontent> <info> A listmessages tag </info> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>folder</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>session</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>message</name> <tagclass>MessageTag</tagclass> <teiclass>MessageTEI</teiclass> <bodycontent>empty</bodycontent> <info> A message tag </info> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>folder</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>session</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>num</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>sendmail</name> <tagclass>SendTag</tagclass> <bodycontent>JSP</bodycontent> <info> An sendmail tag </info> <attribute> <name>host</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>port</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>recipients</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>sender</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>subject</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
Cada una de las etiquetas tiene su propia clase controladora que implementa las acciones de la etiqueta. Por ejemplo, la etiqueta listmessages está implementada en ListMessagesTag.java:
import java.io.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.mail.search.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; /** * Custom tag for listing messages. The scripting variable is only * within the body of the tag. */ public class ListMessagesTag extends BodyTagSupport { private String folder; private String session; private int msgNum = 0; private int messageCount = 0; private Message message; private Message[] messages; private MessageInfo messageinfo; /** * folder attribute getter method. */ public String getFolder() { return folder; } /** * session attribute getter method. */ public String getSession() { return session; } /** * folder setter method. */ public void setFolder(String folder) { this.folder = folder; } /** * session attribute setter method. */ public void setSession(String session) { this.session = session; } /** * Method for processing the start of the tag. */ public int doStartTag() throws JspException { messageinfo = new MessageInfo(); try { Folder folder = (Folder)pageContext.getAttribute( getFolder(), PageContext.SESSION_SCOPE); FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.DELETED), false); messages = folder.search(ft); messageCount = messages.length; } catch (Exception ex) { throw new JspException(ex.getMessage()); } if (messageCount > 0) { getMessage(); return BodyTag.EVAL_BODY_TAG; } else return BodyTag.SKIP_BODY; } /** * Method for processing the body content of the tag. */ public int doAfterBody() throws JspException { BodyContent body = getBodyContent(); try { body.writeOut(getPreviousOut()); } catch (IOException e) { throw new JspTagException("IterationTag: " + e.getMessage()); } // clear up so the next time the body content is empty body.clearBody(); if (msgNum < messageCount) { getMessage(); return BodyTag.EVAL_BODY_TAG; } else { return BodyTag.SKIP_BODY; } } /** * Helper method for retrieving messages. */ private void getMessage() throws JspException { message = messages[msgNum++]; messageinfo.setMessage(message); pageContext.setAttribute(getId(), messageinfo); } }
Las clases TEI son clases "Tag Extra Info" que proporcionan información sobre las variables de scripting que se crean/modifican en tiempo de ejecución. Son necesarias para etiquetas que definen variables de scripting. Esta información se usa durante la fase de tradución de JSP. Aquà tenemos la clase TEI de la etiqueta ListMessages
import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; /** * Extra information class to support the scripting variable created by the * ListMessagesTag class. The scope of the variable is limited to the body * of the tag. */ public class ListMessagesTEI extends TagExtraInfo { public ListMessagesTEI() { super(); } public VariableInfo[] getVariableInfo(TagData data) { VariableInfo info = new VariableInfo(data.getId(),"MessageInfo", true, VariableInfo.NESTED); VariableInfo[] varInfo = { info }; return varInfo; } }
AttachmentServlet
AttachmentServlet obtiene un stream de una parte dada de un mensaje multiparte y lo envÃa hacia el navegador con el tipo de contenido apropiado. Este servlet se usa para mostrar attachments y se relaciona con las capacidades de manejar tipos de contenidos que tiene el navegador.
import java.io.*; import javax.mail.*; import javax.mail.internet.*; import javax.servlet.*; import javax.servlet.http.*; /** * This servlet gets the input stream for a given msg part and * pushes it out to the browser with the correct content type. * Used to display attachments and relies on the browser's * content handling capabilities. */ public class AttachmentServlet extends HttpServlet { /** * This method handles the GET requests from the client. */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { HttpSession session = request.getSession(); ServletOutputStream out = response.getOutputStream(); int msgNum = Integer.parseInt(request.getParameter("message")); int partNum = Integer.parseInt(request.getParameter("part")); MailUserBean mailuser = (MailUserBean)session.getAttribute("mailuser"); // check to be sure we're still logged in if (mailuser.isLoggedIn()) { try { Message msg = mailuser.getFolder().getMessage(msgNum); Multipart multipart = (Multipart)msg.getContent(); Part part = multipart.getBodyPart(partNum); String sct = part.getContentType(); if (sct == null) { out.println("invalid part"); return; } ContentType ct = new ContentType(sct); response.setContentType(ct.getBaseType()); InputStream is = part.getInputStream(); int i; while ((i = is.read()) != -1) out.write(i); out.flush(); out.close(); } catch (MessagingException ex) { throw new ServletException(ex.getMessage()); } } else { getServletConfig().getServletContext(). getRequestDispatcher("/index.html"). forward(request, response); } } }
La Vista
La vista consta de JavaMail.html, que es el punto de entrada inicial. Esta página requiere que el usuario introduzca un username, un password y un hostname IMAP. Después de haber validado la información de login, el usuario navega a traves de una serie de páginas web.

El Controlador
El controlador es el FilterServlet. Este servlet se usa para determinar si el usuario habÃa entrado anteriormente de enviar la petición a la URL seleccionada. El método doPost maneja el envÃo POST de dos formas: login.jsp y compose.jsp. El método doGet maneja las peticiones GET desde el cliente.
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** * This servlet is used to determine whether the user is logged in before * forwarding the request to the selected URL. */ public class FilterServlet extends HttpServlet { /** * This method handles the "POST" submission from two forms: the * login form and the message compose form. */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String servletPath = request.getServletPath(); servletPath = servletPath.concat(".jsp"); getServletConfig().getServletContext(). getRequestDispatcher("/" + servletPath).forward(request, response); } /** * This method handles the GET requests from the client. */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // check to be sure we're still logged in // before forwarding the request. HttpSession session = request.getSession(); MailUserBean mailuser = (MailUserBean)session.getAttribute("mailuser"); String servletPath = request.getServletPath(); servletPath = servletPath.concat(".jsp"); if (mailuser.isLoggedIn()) getServletConfig().getServletContext(). getRequestDispatcher("/" + servletPath). forward(request, response); else getServletConfig().getServletContext(). getRequestDispatcher("/index.html"). forward(request, response); } }
Desarrollo de la aplicación
Esta aplicación fue desarrollada usando:
- JavaMail 1.2
- Servlet 2.2
- JavaServer Pages 1.1
- JavaBeans Activation Framework (JAF) 1.0.1
Para ejecutar esta aplicación, necesitamos lo siguiente:
- Una implementación JSP/Servlet que pueda ser ejecutada como una aplicación solitaria o como una extensión de un servidor Wev. Para está aplicación, usamos Tomcat 3.2.1.
- Un servidor de mail IMAP.
Aquà tenemos unas cuantas imágenes de la ejecución del ejemplo, con su correspondiente código fuente. El punto de entrada es index.html.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1"> <TITLE>JavaMail</TITLE> </HEAD> <BODY BGCOLOR="#CCCCFF"> <FORM ACTION="login" METHOD=POST ENCTYPE="application/x-www-form-urlencoded"> <P ALIGN="CENTER"><B>Welcome to JavaMail</B></P> <P ALIGN="CENTER"><B>HTML Email Reader Demo</B></P> <CENTER> <P> <TABLE BORDER="0" WIDTH="100%"> <TR> <TD WIDTH="40%"> <P ALIGN="RIGHT">IMAP Hostname: </TD> <TD WIDTH="60%"><INPUT TYPE="TEXT" NAME="hostname" SIZE="25"></TD> </TR> <TR> <TD WIDTH="40%"> <P ALIGN="RIGHT">Username: </TD> <TD WIDTH="60%"><INPUT TYPE="TEXT" NAME="username" SIZE="25"></TD> </TR> <TR> <TD WIDTH="40%"> <P ALIGN="RIGHT">Password: </TD> <TD WIDTH="60%"><INPUT TYPE="PASSWORD" NAME="password" SIZE="25"></TD> </TR> </TABLE> <INPUT TYPE="SUBMIT" VALUE="Login"> <INPUT TYPE="RESET" NAME="Reset" VALUE="Reset"></P> </CENTER> <P><B><I>Features:</I></B></P> <UL> <LI>HTML access to your IMAP mailbox <LI>Proxy-able anywhere HTTP can be proxied <LI>Easy to use <LI>Uses web browser's content handling capabilities </UL> <P><B><I>Limitations:</I></B></P> <UL> <LI>Only INBOX support (no user folders) <LI>Can't delete, copy, move, print, save, forward, reply to, search in messages but it could be done <LI>Doesn't check for new messages (have to log out and log back it) </UL> <P> <HR ALIGN="CENTER"> </P> </FORM> </BODY> </HTML>
Un login con éxito nos lleva al inbox. Si el login falla, se muestra la página de error. Entonces el usuario tiene una opción para ver los detalles del error.

<%@ page language="java" import="MailUserBean" %> <%@ page errorPage="errorpage.jsp" %> <%@ taglib uri="http://java.sun.com/products/javamail/demo/webapp" prefix="javamail" %> <html> <head> <title>JavaMail messageheaders</title> </head> <body bgcolor="#ccccff"><hr> <center><font face="Arial,Helvetica" font size="+3"> <b>Folder INBOX</b></font></center><p> <font face="Arial,Helvetica" font size="+3"> <b><a href="logout">Logout</a> <a href="compose" target="compose">Compose</a> </b></font> <hr> <table cellpadding=1 cellspacing=1 width="100%" border=1> <tr> <td width="25%" bgcolor="ffffcc"> <font face="Arial,Helvetica" font size="+1"> <b>Sender</b></font></td> <td width="15%" bgcolor="ffffcc"> <font face="Arial,Helvetica" font size="+1"> <b>Date</b></font></td> <td bgcolor="ffffcc"> <font face="Arial,Helvetica" font size="+1"> <b>Subject</b></font></td> </tr> <javamail:listmessages id="msginfo" folder="folder"> <%-- from --%> <tr valign=middle> <td width="25%" bgcolor="ffffff"> <font face="Arial,Helvetica"> <% if (msginfo.hasFrom()) { %> <%= msginfo.getFrom() %> </font> <% } else { %> <font face="Arial,Helvetica,sans-serif"> Unknown <% } %> </font></td> <%-- date --%> <td nowrap width="15%" bgcolor="ffffff"> <font face="Arial,Helvetica"> <%= msginfo.getDate() %> </font></td> <%-- subject & link --%> <td bgcolor="ffffff"> <font face="Arial,Helvetica"> <a href="messagecontent?message=<%= msginfo.getNum() %>"> <% if (msginfo.hasSubject()) { %> <%= msginfo.getSubject() %> <% } else { %> <i>No Subject</i> <% } %> </a> </font></td> </tr> </javamail:listmessages> </table> </body> </html>

<%@ page isErrorPage="true" %> <html> <head> <title>JavaMail errorpage</title> </head> <body bgcolor="white"> <form ACTION="errordetails" METHOD=POST> <% session.putValue("details", exception.toString()); %> <h2>An error occured while attempting to perform the operation you requested. </h2> <input type="submit" name="Error Details" value="Error Details"> </body> </html>

<%@ page isErrorPage="true" %> <html> <head> <title>JavaMail errordetails</title> </head> <body bgcolor="white"> <%= session.getValue("details") %> </body> </html>
Desde dentro del inbox, el usuario tiene la opción de componer un mensaje o salir.

<%@ page language="java" %> <%@ page errorPage="errorpage.jsp" %> <html> <head> <title>JavaMail compose</title> </head> <body bgcolor="#ccccff"> <form ACTION="send" METHOD=POST> <input type="hidden" name="send" value="send"> <p align="center"> <b><font size="4" face="Verdana, Arial, Helvetica"> JavaMail Compose Message</font></b> <p> <table border="0" width="100%"> <tr> <td width="16%" height="22"> <p align="right"> <b><font face="Verdana, Arial, Helvetica">To:</font></b></td> <td width="84%" height="22"> <% if (request.getParameter("to") != null) { %> <input type="text" name="to" value="<%= request.getParameter("to") %>" size="30"> <% } else { %> <input type="text" name="to" size="30"> <% } %> <font size="1" face="Verdana, Arial, Helvetica"> (separate addresses with commas)</font></td></tr> <tr> <td width="16%"><p align="right"> <b><font face="Verdana, Arial, Helvetica">From:</font></b></td> <td width="84%"> <input type="text" name="from" size="30"> <font size="1" face="Verdana, Arial, Helvetica"> (separate addresses with commas)</font></td></tr> <tr> <td width="16%"><p align="right"> <b><font face="Verdana, Arial, Helvetica">Subject:</font></b></td> <td width="84%"> <input type="text" name="subject" size="55"></td></tr> <tr> <td width="16%"> </td> <td width="84%"><textarea name="text" rows="15" cols="53"></textarea></td></tr> <tr> <td width="16%" height="32"> </td> <td width="84%" height="32"> <input type="submit" name="Send" value="Send"> <input type="reset" name="Reset" value="Reset"></td></tr> </table> </form> </body> </html>

<%@ page language="java" import="MailUserBean" %> <%@ page errorPage="errorpage.jsp" %> <jsp:useBean id="mailuser" scope="session" class="MailUserBean" /> <html> <head> <title>JavaMail logout</title> </head> <% mailuser.logout(); %> <body> <h2>Logged out OK</h2><a href=index.html>click here to login</a> </body> </html>
EWA está compuesto por un documento HTML y varios documentos web (servlets y JSP y etiquetas persnalizadas). a parte de estos, tiene dos directorios:META-INF y WEB-INF.
El directorio META-INF contiene:
- El fichero de manifiesto para la aplicación.
El directorio WEB-INF contiene:
- El fichero web.xml que contiene la configuración y la información de despliegue de la aplicación.
- El directorio classes que contiene las clases servlet y de utilidad usadas por la aplicación web.
- El directorio lib que contiene el archivo (jtl.jar) para la librerÃa de etiquetas personalizadas.
Aquà puedes decargar los fuentes de la aplicación EWA
Construir y empaquetar la aplicación JavaMail
Una vez descomprimido el fichero zip de descarga, los ficheros fuente se encontrarán en los siguientes directorios:
- src/classes
- src/docroot
- src/taglib
Dentro del fichero zip también podrás encontrar dos ficheros de scripts (build.sh y build.bat) para construir y empaquetar la aplicación. Antes de ejecutar estos scripts debes asegurarte de que los siguientes ficheros están en tu CLASSPATH:
- mail.jar - The JavaMail jar file
- activation.jar - the JAF jar file
- servlet.jar - the servlet/JSP jar file
Si lo haces a mano, debes realizar los siguientes pasos para construir y empaquetar la aplicacion:
- Crear un directorio llamado "src/docroot/WEB-INF/classes".
- Crear un directorio llamado "src/docroot/WEB-INF/lib".
- Compilar los ficheros del directorio "src/classes" y añadirlos al directorio "src/docroot/WEB-INF/classes".
- Compilar los ficheros del directorio "src/tablib".
- Crear un archivo jar (jtl.jar) con las clases de la librerÃa taglib y añadirlo a "src/docroot/WEB-INF/lib".
- Crear un archivo web (.war) con los contenidos de "src/docroot" (y todos sus subdirectorios).
Una nota sobre el envÃo de mail
Para poder envÃar correo usando esta aplicación , es necesario especificar un host SMTP. Esto puede hacerse de un par de formas:
- Usar la variable de entorno TOMCAT_OPTS.
Añadiendo lo siguiente al fichero de configuración de Tomcat:-Dmail.smtp.host=yourSMTPmailservername
Rearrancar el servidor. - Modificar el fichero send.jsp y actualizar el fichero javamail.war:
Añadir el siguiente parámetro a la etiqueta <javamail:sendmail>:host="yourSMTPmailservername"
Reempaquetar el fichero javamail.war para incluir el fichero send.jsp modificado.
Conclusión
Esta aplicación demuestra una forma de desarrollar una aplicación usando el API JavaMail y JSP. Se ha hecho un esfuerzo para implementar la mayorÃa de las acciones en la librerÃa de etiquetas y asà minimizar el código en-lÃnea. Sin embargo, el manejo de attachment se ha realizado en un servlet en lugar de en una etiqueta. Esto fue más una materia de conveniencia que de diseño. La funcionalidad de AttachmentServlet se podrÃa haber implementado perfectamente en un etiqueta.
La siguiente versión del API JavaMail contendrá una aplicación demo similar a la explicada en este artÃculo. Contendrá más caracterÃsticas y ciertas modificaciones a esta versión. Por favor visita JavaMail API and Internet Mail Resources para ver las actualizaciones.
Copyright y notas de la traducción
Nota respecto a la traducción
El original en inglés de la presente edición fue escrita por Vyjanthi Kuchibhatla & Jim Glennon, la traducción no oficial fue realizada por Juan A. Palos,cualquier sugerencia o corrección hágala al correo [email protected].
Copyright
Copyright 2001 Sun Microsystems, Inc. All rights reserved. 901 San Antonio Road, Palo Alto, California 94303 USA.
Este documento esta protegido por las leyes de autor. Para mayor información vea http://java.sun.com/copyright.html
Sun, Sun Microsystems, Java y son marcas registradas de Sun Microsystems Incs. en los Estados Unidos y cualquier otro paÃs.