You are on page 1of 21

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

Autor: Juan Antonio Palos (Ozito)

Indice de contenidos
l

API JavaMail Introduccin al API JavaMail Revisin de los Protocolos Relacionados n SMTP n POP n IMAP n MIME n NNTP y Otros Instalar el API JavaMail Instalacin n Instalar JavaMail 1.2 n Instalar JavaMail 1.1.3 n Instalar el Marco de Trabajo de Activacin de JavaBeans n Usarlo con Java 2 Enterprise Edition Configurar Nuestro Entorno JavaMail n Paso 1 n Paso 2 n Paso 3 n Paso 4 n Paso 5 n Paso 6 n Paso 7 Las clases Corazn Revisar las Clases Corazn n Session n Message n Address n Authenticator n Transport n Store y Folder n Ms all Utilizacin del API JavaMail Enviar Mensajes Leer Mensajes Borrar Mensajes y Banderas Autentificacin Responder a Mensajes Re-Enviar Mensajes Trabajar con Attachments Enviar Attachments Obtener Attachments Procesar Mensajes HTML Enviar Mensajes HTML Includir Imgenes en Nuestos Mensajes Buscar Con SearchTerm Bsquedas con SearchTerm Recursos

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

En esta pgina:
l

API JavaMail Introduccin al API JavaMail Revisin de los Protocolos Relacionados n SMTP n POP n IMAP n MIME n NNTP y Otros

API JavaMail
Introduccin al API JavaMail
El API JavaMail es un paquete opcional (extensin estndard) para leer, componer, y enviar mensajes electrnicos. Usamos este paquete para crear programas del tipo MUA (Mail User Agent), similares a Eudora, Pine, y Microsoft Outlook. Su propsito principal no es transportar, enviar, o re-enviar mensajes como sendmail u otros programas del tipo MTA (Mail Transfer Agent). En otras palabras, los usuarios interactan con los programas para leer y escribir e-mails. Los programas MUA tratan con los programas MTA para el envo real. El API JavaMail est diseado para proporcionar acceso independiente del protocolo para enviar y recibir mensajes dividiendose en dos partes:
l l

La primera parte del API es el foco de este tutor. Basicamente, cmo enviar y recibir mensajes independientemente del proveedor/protocolo. La segunda parte habla de lenguajes especificos del protocolo como SMTP, POP, IMAP, y NNTP. Con el API, JavaMail para poder comunicar con un servidor, necesitamos un proveedor para un protocolo.

Revisin de los Protocolos Relacionados


Antes de mirar dentro de las especificaciones del API JavaMail, echemos un vistazo a los protocolos usados con el API. Bsicamente son cuatro:
l l l l

SMTP POP IMAP MIME

Tambin ejecutaremos sobre NNTP y algunos otros. Entender lo bsico de cada protocolo nos ayudar a entender mejor cmo usar el API JavaMail. Aunque el API sea independiente del protocolo, no podemos evitar las limitaciones de los protocolos subyacentes. Si una capacidad no est soportada por el protocolo elegido, el API JavaMail no har que esa capacidad aparezca

por arte de magia. (Como veremos pronto, este es un problema normal cuando trabajamos con POP).

SMTP
El protocolo Simple Mail Transfer Protocol (SMTP) est definido por la RFC 821. Define el mecanismo para enviar e-mail. En el contexto del API JavaMail, nuestro programa basado en JavaMail comunicar con el servidor SMTP de nuestro proveedor de servicios (ISP). Este servidor SMTP dejar el mensaje en el servidor SMTP del recipiente(s) para que sea recogido por los usuarios a travs de POP o IMAP. Esto no requiere que nuestro servidor SMTP sea un rele abierto, pues se utiliza la autentificacin, pero es nuestra responsabilidad asegurarnos de que el servidor SMTP se configure correctamente. No hay nada en el API JavaMail sobre tareas como el configuracin de un servidor para retransmitir mensajes o para agregar y para quitar cuentas del e-mail.

POP
POP viene de Post Office Protocol. Actualmante en la versin 3, tambin conocido como POP3, la RFC 1939 define este protocolo. POP es el mecanismo que la mayora de la gente usa en Internet para conseguir su correo. Define el soporte de un slo mailbox por cada usuario. sto es todo lo que lo hace, y sta tambin es la fuente de la mayora de la confusin. Muchas de las cosas con que gente se familiariza cuando usa POP, como la capacidad de ver cuntos mensajes de correo nuevos tienen, no lo soporta POP en absoluto. Estas capacidades se construyen en programas como Eudora o Microsoft Outlook, que recuerdan cosas como los ltimos correos recibidos y calculan cuntos tenemos nuevos. As pues, al usar el API JavaMail, si queremos este tipo de informacin tendremos que calcularla nosotros mismos.

IMAP
IMAP es un protocolo ms avanzado para recibir mensajes. Definido en la RFC 2060, IMAP viene de Internet Message Access Protocol, y est actualmente en la versin 4, tambin conocida como IMAP4. Para usar el IMAP, nuestro servidor de correo debe soportar este protocolo. No podemos simplemente cambiar nuestro programa para usar IMAP en vez de POP y que se soporte todo IMAP. Si asumimos que nuestro servidor de correo soporta IAMP, nuestro programa basado en JavaMail puede aprovecharse de los usuario que tienen carpetas mltiples en el servidor y estas carpetas se pueden compartir por varios usuarios. Debido a las capacidades ms avanzadas, podramos pensar que IMAP sera utilizado por todos. Pero no es as. Sobrecarga mucho el servidor de correo, requiriendo que el servidor reciba los nuevos mensajes, los entrege a los usuarios cuando sean solicitados, y los mantiene en las distintas carpetas de cada usuario. Aunque que esto centraliza las copias de seguridad, tambin hace que las carpetas de correo a largo plazo de los usuarios se hagan cada vez ms grandes, y todo el mundo sufre cuando se agota el espacio en el disco. Con POP, los mensajes recuperados son eliminados del servidor de correo.

MIME
MIME viene de Multipurpose Internet Mail Extensions. No es un protocolo de transferencia de e-mail. En su lugar, define el contenido de lo que se est transfiriendo: el formato de los mensajes, los attachments, etc. Hay muchos documentos que tienen efecto sobre esto: las RFC 822, RFC 2045, RFC 2046, y RFC 2047. Como usuario del API JavaMail, normalmente no tendremos que preocuparnos sobre estos formatos. Sin embargo, estos formatos existen y son utilizados por nuestros programas.

NNTP y Otros
A causa de la divisin del API JavaMail entre proveedor y cualquier otra cosa, podemos fcilmente soportar protocolos adicionales. Sun Mantiene una lista de proveedores de terceras partes que se aprovechan de los protocolos para los que Sun no proporciona soporte. All encontraremos soporte para NNTP Network News Transport Protocol [newsgroups], S/MIME Secure Multipurpose Internet Mail Extensions, y ms.

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

En esta pgina:
l

Instalar el API JavaMail Instalacin n Instalar JavaMail 1.2 n Instalar JavaMail 1.1.3 n Instalar el Marco de Trabajo de Activacin de JavaBeans n Usarlo con Java 2 Enterprise Edition Configurar Nuestro Entorno JavaMail n Paso 1 n Paso 2 n Paso 3 n Paso 4 n Paso 5 n Paso 6 n Paso 7

Instalar el API JavaMail


Instalacin
Hay dos versiones del API JavaMail usadas comunmente hoy en dia: la 1.2 y la 1.1.3. Todos los ejemplos de este artculo funcionan con mbas. Mientras 1.2 es el ltimo, 1.1.3 es la versin incluida en la versin 1.2.1 de la Plataforma Java 2 Enterprise Edition (J2EE), por eso es tan usado. La versin del API que queramos usar afecta a lo que tengamos que descargar e instalar. Todo funcionar con el JDK 1.1.6+, de la Plataforma Java 2, Standard Edition (J2SE) versin 1.2.x, y J2SE versin 1.3.x.

Nota: despus de instalar la implementacin de JavaMail de Sun, podrs encontrar muchos programas de ejemplo en el directorio: demo. Instalar JavaMail 1.2
Para usar el API JavaMail 1.2, descargamos la implementacin, JavaMail 1.2, descomprimimos el fichero javamail-1_2.zip, y aadimos el fichero mail.jar a nuestro CLASSPATH. La implementacin 1.2 viene con proveedores para SMTP, IMAP4, y POP3 junto con las clases corazn. Despus de instalar JavaMail 1.2, instalamos el marco de trabajo de activacin de JavaBeans.

Instalar JavaMail 1.1.3


Para usar el API JavaMail 1.1.3, descargamos la implementacin JavaMail 1.1.3, descomprimimos el ficheros javamail1_1_3.zip, y aadimos el fichero mail.jar a nuestro CLASSPATH. La implementacin 1.1.3 viene con proveedores para SMTP y IMAP4, junto con las clases corazn.

Si queremos acceder a un servidor POP con JavaMail 1.1.3, descargamos e instalamos un proveedor POP3. Sun tiene uno disponible separado de la implementacin de JavaMail. despus de descargar y descomprimir pop31_1_1.zip, tambin aadimos pop3.jar a nuestro CLASSPATH. Despus de instalar JavaMail 1.1.3, instalamos el marco de trabajo de activacin de JavaBeans.

Instalar el Marco de Trabajo de Activacin de JavaBeans


Todas las versiones del API JavaMail requieren el Marco de Trabajo para la Activacin de JavaBeans. El marco de trabajo aade soporte para tecleo arbitrario de bloques de datos y manejarlos correctamente. Esto no suena muy bien, pero es nuestro soporte bsico para MIME-type encontrado en muchos navegadores y herramientas de correo, hoy en da. Despus de descargar el marco de trabajo, descomprimimos el fichero jaf1_0_1.zip, y aadimos el fichero activation.jar a nuestro CLASSPATH. Para usuarios de JavaMail 1.2, deberamos tener mail.jar y activation.jar en nuestro CLASSPATH. Para usuarios de JavaMail 1.1.3, deberamos tener mail.jar, pop3.jar, y activation.jar en nuestro CLASSPATH. Si no tenemos planes de utilizar POP3, no necesitamos aadirlo a nuestro CLASSPATH. Si no queremos modificar nuestra variable de entorno CLASSPATH, copiamos los ficheros JAR a nuestro directorio lib/ext bajo el directorio del Java Runtime Environment (JRE). Por ejemplo, para la versin J2SE 1.3, el directorio por defecto sera C:\jdk1.3\jre\lib\ext en una plataforma Windows.

Usarlo con Java 2 Enterprise Edition


Si usamos J2EE, no tenemos que hacer nada especial para usar el API bsico de JavaMail; viene con las clases del J2EE. Slo debemos asegurarnos de que el fichero j2ee.jar est en nuestro CLASSPATH y que tenemos todo configurado. Para J2EE 1.2.1, el proveedor POP3 viene separado, por eso lo descargamos y seguimos los pasos para incluir el proveedor POP3 como se mostr en Instalar JavaMail 1.1.3. Los usuario de J2EE 1.3 obtienen el proveedor POP3 con el J2EE por eso no requieren una instalacin separada. Tampoco se requiere ninguna instalacin para el Marco de Trabajo de Activacin de JavaBeans.

Configurar Nuestro Entorno JavaMail


Paso 1
Descargar la ltima versin de la implementacin del API JavaMail desde Sun.

Paso 2
Descargar la ltima versin del Marco de Trabajo de Activacin de JavaBeans desde Sun.

Paso 3
Descomprimir los paquetes descargados. Obtendremos un fichero ZIP para todas los plataformas de los dos paquetes. Podemos usar la herramienta jar para descomprimir los paquetes.

Paso 4
Aadimos los ficheros mail.jar y activation.jar recien descomprimidos a nuestro CLASSPATH. Copiamos estos ficheros a nuestro directorio de libreras de extensin. Para Windows, y usando una instalacin por defecto, el comando se parecera a esto:

cd \javamail-1.2 copy mail.jar \jdk1.3\jre\lib\ext cd \jaf-1.0.1 copy activation.jar \jdk1.3\jre\lib\ext Si no nos gusta copiar los ficheros al directorio de libreras de extensin, en Sun puedes encontrar instrucciones detalladas para configurar el CLASSPATH sobre Windows NT

Paso 5
Vamos dentro del directorio demo que viene con la implementacin del API JavaMail y compilamos el programa msgsend para enviar un mensaje de prueba: javac msgsend.java

Paso 6
Ejecutamos el programa pasandole una direccin "from" en la opcin -o, nuestro servidor SMTP con la opcin -M, y la direccin "to" (sin opcin). Luego introduciremos el subject, el texto de nuestro mensaje y el caracter de fin-de-fichero (CTRL-Z) para indicar el final de la introduccin del mensaje. Debemos asegurarnos de reemplazar las direcciones correctas: java msgsend -o from@address -M SMTP.Server to@address Si no estas seguro de tu servidor SMTP, contacta con el administrador de tu sistema o pregunta a tu proveedor de Internet.

Paso 7
Para asegurarnos de que hemos recibido el mensaje, debemos chequearlo con nuestro lector de correo habitual (Eudora, Outlook Express, pine, ...).

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

En esta pgina:
l

Las clases Corazn Revisar las Clases Corazn n Session n Message n Address n Authenticator n Transport n Store y Folder n Ms all

Las clases Corazn


Revisar las Clases Corazn
Antes de profundizar en las classes de JavaMail, veremos las clases corazn que componen el API: Session, Message, Address, Authenticator, Transport, Store, y Folder. Todas estas clases se encuentran en el paquete del nivel superior del API JavaMail: javax.mail, aunque frecuentemente nos veremos utilizando clases del paquete javax.mail.internet.

Session
La clase Session define una sesin de correo bsica. Es a travs de esta de sesin de la que todas las dems funcionan. El objeto Session se aprovecha de un objeto java.util.Properties para obtener informacin como el servidor de correo, el nombre de usuario, la password, y otra informacin que puede compartirse a lo largo de toda la aplicacin. El constructor para las clases es privado. Podemos obtener una sola sesin por defecto que puede ser compartida con el mtodo getDefaultInstance(): Properties props = new Properties(); // fill props with any information Session session = Session.getDefaultInstance(props, null); O podemos crear una nica sesin con getInstance(): Properties props = new Properties(); // fill props with any information Session session = Session.getInstance(props, null); En ambos casos el argumento null es un objeto Authenticator que no se utiliza en este momento, lo veremos ms adelante en Authenticator. En la mayora de los casos, es suficiente usar la sesin compartida, incluso si se trabaja con una sesin de correo para mltiples mailboxes de usuario. Podemos aadir una combinacin de nombre de usuario y passsword en un paso posterior en el proceso de comunicacin,

manteniendolo todo separado.

Message
Una vez que tenemos nuestro objeto Session, es hora de empezar a crear un mensaje para enviar. Esto se hace con un objeto Message. Siendo una clase abstracta, debemos trabajar con una subcalse, en la mayora de los casos ser javax.mail.internet.MimeMessage. Un MimeMessage es un mensaje de e-mail que entiende los tipos MIME, definidos en las distintas RFCs. Las cabeceras de mensajes estn restringidas a caracteres US-ASCII, aunque en ciertos campos de cabecera se pueden codificar caracteres no ASCII. Para crear un Message, le pasamos el objeto Session al constructor de MimeMessage: MimeMessage message = new MimeMessage(session);

Nota: Hay otros constructores, como para crear mensajes desde streams de entrada formateados RFC822.
Una vez que tenemos nuestro mensaje, podemos configurar sus diferentes partes, como Message implementa el interface Part (con MimeMessage implementando MimePart). El mecanismo bsico para configurar el contenidos es el mtodo setContent(), con los argumentos para el contenido y tipo mime: message.setContent("Hello", "text/plain"); Sin embargo, si sabemos que estmos trabajando con un MimeMessage y nuestro mensaje es texto plano, podemos usar su mtodo setText() que slo requiere el contenido real, dejando por defecto el tipo MIME a text/plain: message.setText("Hello"); Para mensajes de texto plano la ltima forma es el mecanismo preferido para seleccionar el contenido. Para enviar otros tipos de mensajes, como HTML, usaremos el formador, que veremos ms adelante. Para seleccionar el subject, usamos el mtodo setSubject(): message.setSubject("First");

Address
Una vez que hemos creado la Session y el Message, y tambin hemos rellenado el mensaje con contenido, es hora de poner direccin a nuestra carta con un objeto Address. Como Message, Address es una clase abstracta. Usaremos la clase javax.mail.internet.InternetAddress. Para crear una direccin con slo la direccin e-mail, se la pasamos al constructor: Address address = new InternetAddress("president@whitehouse.gov"); Si queremos que aparezca el nombre junto a la direccin e-mail, tambin podemos pasrselo al constructor: Address address = new InternetAddress("president@whitehouse.gov", "George Bush"); Necesitaremos crear objetos address para los campos from y to del mensaje. A menos que el

servidor lo evite, no hay nada que nos impida enviar un mensaje que parezca que viene de otra persona. Una vez que hemos creado las direcciones, las conectamos al mensaje de una de estas dos formas. Para identificar al que lo enva, usamos los mtodos setFrom() y setReplyTo(). message.setFrom(address) Si nuestro mensane necesita varias direcciones "from", usamos el mtodo addFrom(): Address address[] = ...; message.addFrom(address); Para identificar a los receptores del mensaje, usamos el mtodo addRecipient(). Este mtodo requiere un Message.RecipientType junto a la direccin. message.addRecipient(type, address) Los tres tipos predefinidos de direcciones son:
l l l

Message.RecipientType.TO Message.RecipientType.CC Message.RecipientType.BCC

Por eso, si el mensaeje fuera dirigido al vice-presidete, enviando copia a la primera dama, esto sera lo apropiado: Address toAddress = new InternetAddress("vice.president@whitehouse.gov"); Address ccAddress = new InternetAddress("first.lady@whitehouse.gov"); message.addRecipient(Message.RecipientType.TO, toAddress); message.addRecipient(Message.RecipientType.CC, ccAddress); El API JavaMail no proporciona mecanismo para chequear la validez de una direccin e-mail. Pero si podemos hacer que nuestro programa soporte un scan de caracteres vlidos (segn lo definido en la RFC 822) o verificar nosotros mismos el registro MX (Mai Exchange), esto va ms all del mbito del API JavaMail.

Authenticator
Como las clases java.net, el API JavaMail peude aprovecharse de un Authenticator para proteger accesos a recursos mediante un nombre de usuario y una password. Para el API JavaMail, el recursos es el servidor de correo. El Authenticator JavaMail se encuentra en el paquete javax.mail y es diferente de la clase de java.net con el mismo nombre. Las dos no comparten el mismo Authenticator ya que el API JavaMail funciona con Java 1.1, que no tena la veriedad java.net. Para usar el Authenticator, subclasificamos la clase abstracta y devolvemos un ejemplar PasswordAuthentication del mtodo getPasswordAuthentication(). Debemos registrar el Authenticator con la sesin cuando se crea. Luego, nuestro Authenticator ser notificado cuando sea necesaria una autentificacin. Podramos mostrar una ventana o leer el nombre de usuario y la password desde un fichero de configuracin (aunque si no est encriptado no es seguro), devolviendolo al llamador como un objeto PasswordAuthentication. Properties props = new Properties(); // fill props with any information Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth);

Transport
La parte final del envo de un mensaje es usar la clase Transport. Estas clase habla el lenguaje especfico del protocolo para enviar mensajes (normalmente SMTP). Es una clase abstracta y funciona como Session. Podemos usar la versin por defecto de la clase slo llamando al mtodo esttico send():

Transport.send(message); O, podemos obtener un ejemplar especfico desde la sesin para nuestro protocolo, pasndole el nombre de usuario y la password (en blanco si no son necesarias), enviar el mensaje, y cerrar la conexin: message.saveChanges(); // implicit with send() Transport transport = session.getTransport("smtp"); transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); Esta ltima forma es mejor cuando necesitamos enviar varios mensajes, porque mantendr activa la conexin entre mensajes. El mecanismo bsico send() hace un conexin separada al servidor para cada llamada a mtodo. Nota: Para ver los comandos enviados al servidor de correo activaremos la bandera debug con session.setDebug(true).

Store y Folder
Obtener los mensajes empieza de forma similar a enviar mensajes, con una Session. Sin embargo, despus de obtener la sesin, conectamos a un Store, probablemente con un nombre de usuario y una password o Authenticator. Como con Transport, le decimos al Store qu protocolo utilizar: // Store store = session.getStore("imap"); Store store = session.getStore("pop3"); store.connect(host, username, password); Despus de conectar al Store, podemos obtener un Folder, que debe estar abierto antes de poder leer los mensajes que hay en su interior: Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); Para POP3, la nica carpeta disponible es INBOX. Si estamos usando IMAP, podremos disponer de otras carpetas. Nota: Los proveedores de Sun se han pensado para ser inteligentes. Mientras que Message message[] = folder.getMessages(); podra parecer una operacin lenta que lee todos los mensajes del servidor, slo cuando realmente necesitamos obtener una parte del mensaje es cuando el contenido es recuperado. Una vez que tenemos un Message para leer, podemos obtener sus contenidos con getContent() o escribir sus contenidos en un stream con writeTo(). El mtodo getContent() slo obtiene el contenido del mensaje, mientras que la salida de writeTo() incluye las cabeceras. System.out.println(((MimeMessage)message).getContent()); Despus de haber ledo el e-mail, cerramos la conexin al folder y al store. folder.close(aBoolean); store.close(); El valor boolenao pasado al mtodo close() del folder significa si actualizamos o no la carpeta eliminando los mensajes borrados.

Ms all
Esencialmente, entender cmo usar las siete clases es todo lo que necesitamos para manejar el API JavaMail. La mayora de las otras capacidades del API JavaMail construidas desde estas siete clases hacen algo un poco diferente o de una forma particular, como si el contenido es un attachment. Ciertas tareas, como las bsquedas, estn aisladas y se describen en la seccin Busquedas por SearchItem.

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

En esta pgina:
l

Utilizacin del API JavaMail Enviar Mensajes Leer Mensajes Borrar Mensajes y Banderas Autentificacin Responder a Mensajes Re-Enviar Mensajes Trabajar con Attachments Enviar Attachments Obtener Attachments Procesar Mensajes HTML Enviar Mensajes HTML Includir Imgenes en Nuestos Mensajes

Utilizacin del API JavaMail


Ya hemos visto como trabajar con las partes principales del API JavaMail. En esta pgina encontraremos aproximaciones de cmo conectar las piezas para realizar tareas especficas.

Enviar Mensajes
Enviar un mensaje de e-mail implica obtener una sesin, crear y rellenar un mensaje y enviarlo. Podemos especificar nuestro servidor SMTP configurando la propiedad mail.smtp.host del objeto Properties cuando se obtuvo la Session: String host = ...; String from = ...; String to = ...; // Get system properties Properties props = System.getProperties(); // Setup mail server props.put("mail.smtp.host", host); // Get session Session session = Session.getDefaultInstance(props, null); // Define message MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello JavaMail");

message.setText("Welcome to JavaMail"); // Send message Transport.send(message); Deberamos situar el cdigo dentro de un bloque try-catch, porque la configuracin del mensaje y su envo pueden lanzar excepciones. Aqu tienes el cdigo fuente MailExample.java completo.

Leer Mensajes
Para leer mensajes, obtenemos una sesin, y nos conectamos con el store apropiado para nuestro mailbox, abrimos la carpeta apropiada, y obtenemos nuestros mensajes. Tambin, no debemos olvidarnos de cerrar la conexin cuando hayamos terminado. String host = ...; String username = ...; String password = ...; // Create empty properties Properties props = new Properties(); // Get session Session session = Session.getDefaultInstance(props, null); // Get the store Store store = session.getStore("pop3"); store.connect(host, username, password); // Get folder Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); // Get directory Message message[] = folder.getMessages(); for (int i=0, n=message.length; i<n; i++) { System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject()); } // Close connection folder.close(false); store.close(); Lo que hagamos con cada mensaje es cosa nuestra. El bloque de cdigo anterior slo muestra de quin viene el mensaje y el subject. Tcnicamente hablando, la lista de direcciones "from" podra estar vaca y la llamada a getFrom()[0] podra lanzar una excepcin. Para mostrar el mensaje completo, podemos pedrselo al usuario despus de haya visto los campos subject, y luego llamar al mtodo writeTo() si quiere verlo. BufferedReader reader = new BufferedReader ( new InputStreamReader(System.in)); // Get directory Message message[] = folder.getMessages(); for (int i=0, n=message.length; i<n; i++) { System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject()); System.out.println("Do you want to read message? " + "[YES to read/QUIT to end]");

String line = reader.readLine(); if ("YES".equals(line)) { message[i].writeTo(System.out); } else if ("QUIT".equals(line)) { break; } } Aqu tienes el cdigo fuente GetMessageExample.java completo.

Borrar Mensajes y Banderas


Borrar mensajes implica trabajar con lasFlags asociadas con los mensajes. Hay diferentes banderas para diferentes estados, algunas definidas por el sistema y otras definidas por el usuario. Las banderas predefinidas se definen en forma de clase interna Flags.Flag y se listan abajo:
l l l l l l l

Flags.Flag.ANSWERED Flags.Flag.DELETED Flags.Flag.DRAFT Flags.Flag.FLAGGED Flags.Flag.RECENT Flags.Flag.SEEN Flags.Flag.USER

Slo porque una bandera exista no significa que sea soportada por todos los proveedores/servidores de correo. Por ejemplo, excepto la de mensaje borrado, el protocolo POP no soporta ninguna de ellas. Chequear por nuevo correo no es una tarea de POP pero si est construidad en los clientes de correo. Para conocer las banderas soportadas, solicitamos la carpeta con getPermanentFlags(). Para borrar mensajes, seleccionamo la bandera DELETED del mensaje: message.setFlag(Flags.Flag.DELETED, true); Primero debemos abrir la carpeta en modo READ_WRITE: folder.open(Folder.READ_WRITE); Luego, cuando hayamos procesado todos los mensajes, cerramos la carpeta, pasando un valor true para purgar todos los mensajes borrados. folder.close(true); Hay un mtodo expunge() de Folder que puede usarse para borrar los mensajes. Sin embargo, no funciona con el proveedor POP3 de Sun. Otros proveedores podran o no podran implementar estas capacidades. Seran ms que las implementadas por los proveedores de IMAP. Como POP slo soporta acceso al mailbox, nosotros tenemos que cerrar la carpeta para borrar los mensajes con el proveedor de Sun. Para deseleccionar una bandera, slo pasando false al mtodo setFlag(). Para ver si una bandera est seleccionada, lo comprobamos con isSet().

Autentificacin
Aprendimos anteriormente que podemos usar un Authenticator para pedir un nombre de usuario y una password cuando sea necesario, en vez de pasarlo en strings. Aqu veremos como hacer un uso ms til de la autentificacin. En lugar de conectar al Store con el host, el username, y la password, configuramos las Properties que tiene el host, y le decimos a la Session el ejemplar del Authenticator personalizado:

// Setup properties Properties props = System.getProperties(); props.put("mail.pop3.host", host); // Setup authentication, get session Authenticator auth = new PopupAuthenticator(); Session session = Session.getDefaultInstance(props, auth); // Get the store Store store = session.getStore("pop3"); store.connect(); Luego subclasificamos Authenticator y devolvemos un objeto PasswordAuthentication desde el mtodo getPasswordAuthentication(). Abajo tenemos una implementacin de dicho mtodo, con un slo campo para mbos. Slo debemos introducir las dos partes en un campo, separadas por una coma. import javax.mail.*; import javax.swing.*; import java.util.*; public class PopupAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { String username, password; String result = JOptionPane.showInputDialog( "Enter 'username,password'"); StringTokenizer st = new StringTokenizer(result, ","); username = st.nextToken(); password = st.nextToken(); return new PasswordAuthentication(username, password); } } Como el PopupAuthenticator trata con Swing, arrancar el thread de manejo de eventos para el AWT. Esto bsicamente requiere que aadamos una llamada a System.exit() en nuestro cdigo para parar el programa.

Responder a Mensajes
La clase Message incluye un mtodo reply() para configurar un nuevo Message con el recipiente apropiado, aadiendo "Re: " al subject si no est ya. Esto no aade nada al contenido del mensaje, slo copia las cabeceras from o reply-to al nuevo recipiente. El mtodo toma un parmetro booleano indicando si la respuesta va aser a uno (false) o a todos (true). MimeMessage reply = (MimeMessage)message.reply(false); reply.setFrom(new InternetAddress("president@whitehouse.gov")); reply.setText("Thanks"); Transport.send(reply); Para configurar la direccin reply-to cuando se enva un mensaje, utilizamos el mtodo setReplyTo(). Aqu tienes el cdigo fuente ReplyExample.java completo.

Re-Enviar Mensajes
Re-enviar mensajes es un poco ms complicado. No hay una sla llamada a mtodo, y construimos el mensaje a re-enviar trabajando con las partes que componen un mensaje.

Un mensaje de correo puede estar compuesto de varias partes, cada parte es un BodyPart, o ms especfiamente, un MimeBodyPart cuando se trabaja con mensajes MIME. Las diferentes partes del cuerpo se combinan en un contenedor llamado Multipart o, de nuevo, ms especificamente un MimeMultipart. Para re-enviar un mensaje, creamos una parte para el texto de nuestro mensaje y una segunda parte con el mensaje a re-enviar, y las combinamos dentro de un multipart. Luego aadimos el multipart a un mensaje direccionado apropiadamente y lo enviamos. Es esto esencialmente. Para copiar el contenido de un mensaje a otro, slo lo copiamos sobre su DataHandler, una clase del JavaBeans Activation Framework. // Create the message to forward Message forward = new MimeMessage(session); // Fill in header forward.setSubject("Fwd: " + message.getSubject()); forward.setFrom(new InternetAddress(from)); forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Create your new message part BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText( "Here you go with the original message:\n\n"); // Create a multi-part to combine the parts Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // Create and fill part for the forwarded content messageBodyPart = new MimeBodyPart(); messageBodyPart.setDataHandler(message.getDataHandler()); // Add part to multi part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message forward.setContent(multipart); // Send message Transport.send(forward);

Trabajar con Attachments


Los Attachments son recursos asociados con un mensaje e-mail, normalmente mantenidos fuera del mensaje, como un fichero de texto, una hoja de clculo o una imagen. Al igual que con los programas de e-mail normales como Eudora y Pine, podemos adjuntar recursos a nuestros mensajes con el API JavaMail y obtener dichos attachments cuando recibamos el mensaje.

Enviar Attachments
Enviar attachments es bastante sencillo. Construimos las partes de un mensaje completo. Despus de la primera parte, el texto del mensaje, aadimos otras partes donde el DataHandler para cada una es nuestro attachment, en vez de compartir el handler como en el caso de reenvio de mensajes. Si estamos leyendo el attachment desde un fichero, nuestra fuente de datos es un FileDataSource. Si leemos desde una URL, es una URLDataSource. Una vez que tenemos nuestro DataSource, se lo pasamos al constructor de DataHandler, y finalmente lo adjutamos al BodyPart con setDataHandler().

Asumiendo que queremos retener el nombre del fichero original para el attachment, la ltima cosa a hacer es seleccionar el nombre de fichero asociado con el attachment con el mtodo setFileName() de BodyPart. Todo esto lo podemos ver aqu: // Define message Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello JavaMail Attachment"); // Create the message part BodyPart messageBodyPart = new MimeBodyPart(); // Fill the message messageBodyPart.setText("Pardon Ideas"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // Part two is attachment messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); // Put parts in message message.setContent(multipart); // Send the message Transport.send(message); Cuando incluimos attachments con nuestros mensajes, si nuestro programa es un servlet, los usuarios deben subir el fichero cuando nos digan donde enviar el mensaje. La subida de cada fichero puede ser manejada con un tipo de formulario codificado multipart/form-data. <FORM ENCTYPE="multipart/form-data" method=post action="/myservlet"> <INPUT TYPE="file" NAME="thefile"> <INPUT TYPE="submit" VALUE="Upload"> </FORM> Nota: El tamao del mensaje est limitado por el servidor SMTP, no por el API JavaMail. Si tenemos problemas podemos incrementar el tamao de la pila seleccionado los parmetros ms y mx. Aqu tienes el cdigo fuente MailExample.java completo.

Obtener Attachments
Obtener attachments de nuestros mensajes es un poco ms complicado que enviarlos, ya que MIME no tiene la sencilla nocin de Attachments. El contenido de nuestro mensaje es un objeto Multipart cuando tiene attachments. Entonces necesitamos procesar cada Part, para obtener el contenido principal del attachment(s). Las partes marcadas con una disposicin de Part.ATTACHMENT desde part.getDisposition() son claramente attachments. Sin embargo, los attachments tambin pueden venir sin disposicin (y un tipo MIME no texto) o una disposicin de Part.INLINE. Cuando la disposicin es Part.ATTACHMENT o Part.INLINE, podemos grabar el contenido de esa parte del mensaje. Obtenemos el nombre del fichero original con getFileName() y el stream de entrada con getInputStream().

Multipart mp = (Multipart)message.getContent(); for (int i=0, n=multipart.getCount(); i<n; i++) { Part part = multipart.getBodyPart(i)); String disposition = part.getDisposition(); if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT) || (disposition.equals(Part.INLINE))) { saveFile(part.getFileName(), part.getInputStream()); } } El mtodo saveFile() slo crea un File desde el nombre del fichero, lee los bytes desde el stream de entrada y los escribe en el fichero. En el caso de que el fichero ya exista, se aade un nmero al final del nombre del fichero hasta que se encuentre uno que no exista. // from saveFile() File file = new File(filename); for (int i=0; file.exists(); i++) { file = new File(filename+i); } El cdigo de arriba cubre el caso ms sencillo cuando las partes del mensaje se marcan apropiadamente. Para cubrir todos los casos. Debemos manejar cuando la disposicin es null y obtener el tipo MIME de la parte para manejarla de forma apropiada. if (disposition == null) { // Check if plain MimeBodyPart mbp = (MimeBodyPart)part; if (mbp.isMimeType("text/plain")) { // Handle plain } else { // Special non-attachment cases here of image/gif, text/html, ... } ... }

Procesar Mensajes HTML


Enviar mensajes basados en HTML puede dar un poco ms de trabajo que enviar mensaje slo de texto, aunque no demaisado. Todo depende de los requerimientos que especifiquemos.

Enviar Mensajes HTML


Si todo lo que necesitamos hacer es enviar el equivalente de un fichero HTML como el mensaje y dejar que el lector de correo se preocupe de colocar cualquier imagen embebida o piezas relacionadas, usamos el mtodo setContent() de Message, pasandole el contenido como un String y selecionando el tipo de contenido como text/html. String htmlText = "<H1>Hello</H1>" + "<img src=\"http://www.jguru.com/images/logo.gif\">"; message.setContent(htmlText, "text/html")); En la parte del receptor, si procesamos el mensaje con el API JavaMail, no hay nada dentro del API para mostrar mensajes HTML. El API JavaMail slo ve un stream de bytes. Para mostrar el mensaje HTML, debemos usar un JEditorPane de Swing o cualquier otro componente visualizador de terceras partes. if (message.getContentType().equals("text/html")) { String content = (String)message.getContent(); JFrame frame = new JFrame();

JEditorPane text = new JEditorPane("text/html", content); text.setEditable(false); JScrollPane pane = new JScrollPane(text); frame.getContentPane().add(pane); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.show(); }

Includir Imgenes en Nuestos Mensajes


Por otro lado, si queremos que nuestro mensaje HTML sea completo, con imagenes embebidas incluidas como parte del mensaje, debemos tratar las imgenes como un attachment y referenciarlas con una URL especial cid, donde el cid es una referencia a la cabecera Content-ID de la imagen adjunta. El proceso de embeber imgenes es muy similar a adjuntar un fichero a un mensaje, la nica diferencia es que tenemos que decirle al MimeMultipart que las partes estn relacionadas configurando su subtipo en el constructor (o con setSubType()) y configurando la cabecera Content-ID de la imagen a un string aleatorio que es usado como el src de la imagen en la etiqueta img. Este cdigo explica todo lo anterior: String file = ...; // Create the message Message message = new MimeMessage(session); // Fill its headers message.setSubject("Embedded Image"); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Create your new message part BodyPart messageBodyPart = new MimeBodyPart(); String htmlText = "<H1>Hello</H1>" + "<img src=\"cid:memememe\">"; messageBodyPart.setContent(htmlText, "text/html"); // Create a related multi-part to combine the parts MimeMultipart multipart = new MimeMultipart("related"); multipart.addBodyPart(messageBodyPart); // Create part for the image messageBodyPart = new MimeBodyPart(); // Fetch the image and associate to part DataSource fds = new FileDataSource(file); messageBodyPart.setDataHandler(new DataHandler(fds)); messageBodyPart.setHeader("Content-ID","memememe"); // Add part to multi-part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message message.setContent(multipart); Aqu tienes el cdigo fuente HtmlImageExample.java completo.

Java en castellano recomienda...

No se puede mostrar la pgina


La pgina Web solicitada no est disponible en este momento.

API JavaMail

En esta pgina:
l

Buscar Con SearchTerm Bsquedas con SearchTerm Recursos

Buscar Con SearchTerm


Bsquedas con SearchTerm
El API JavaMail incluye un mecanismo d efiltrado encontrado en el paquete javax.mail.search para construir un SearchTerm. Una vez construido, podemos solicitarel a una Folder qu mensajes concuerdan, recuperar un array de objetos Message: SearchTerm st = ...; Message[] msgs = folder.search(st); Hay disponibles 22 clases diferentes para ayudarnos a construir un SearchTerm.
l l l l l l

AND (clase AndTerm) OR (clase OrTerm) NOT (clase NotTerm) SENT DATE (clase SentDateTerm) CONTENT (clase BodyTerm) HEADER (FromTerm / FromStringTerm, RecipientTerm/ RecipientStringTerm, SubjectTerm, etc.)

Esencialmente, construimos una expresin lgica para concordar mensajes, luegos los buscamos. Por ejemplo, el siguiente trmino busca los mensajes con uns string (parcial) en el sibject de ADV o un campo "from" de friend@public.com. Podramos considerar la ejecucin peridica de esta consulta y borrar automticamente cualquier mensaje devuelto. SearchTerm st = new OrTerm( new SubjectTerm("ADV:"), new FromStringTerm("friend@public.com")); Message[] msgs = folder.search(st);

Recursos
Se pueden hacer muchas ms cosas con el API JavaMail que las descritas aqu. Podrs encontrarlas en las sigueintes direcciones:

l l l l l l

JavaMail API Home JavaBeans Activation Framework Home javamail-interest mailing list Sun's JavaMail FAQ jGuru's JavaMail FAQ Third Party Products List

You might also like