Aplicación Web de E-Mail usando Librerías de Etiquetas JSP

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:

  1. 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.
  2. 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%">&nbsp;</td>
<td width="84%"><textarea name="text" rows="15" cols="53"></textarea></td></tr>
<tr>
<td width="16%" height="32">&nbsp;</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:

  1. Crear un directorio llamado "src/docroot/WEB-INF/classes".
  2. Crear un directorio llamado "src/docroot/WEB-INF/lib".
  3. Compilar los ficheros del directorio "src/classes" y añadirlos al directorio "src/docroot/WEB-INF/classes".
  4. Compilar los ficheros del directorio "src/tablib".
  5. Crear un archivo jar (jtl.jar) con las clases de la librería taglib y añadirlo a "src/docroot/WEB-INF/lib".
  6. 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:

  1. 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.
  2. 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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP