Estoy trabajando en un sistema que recibe emails en un Sendmail y este mediante CURL redirecciona a un Tomcat Server para ejecutar comandos. Todo esto es porque lso sres clientes no puden hacer un miserable webservice. Como la verdad shell script no es mi fuerte, opté por redireccionar mediante sendmail alias a un script el cual nuevamente redirecciona usando CURL a una URL.

El shell

#!/bin/sh

TEMP_FILE=$(date +%k%M%S%N)
URL=http://someserver/somefile

#writes to disk the email file
while read line; do
  echo $line >> $TEMP_FILE
done

curl -F "file=@$TEMP_FILE" $URL

#wipes out the temp file
rm -rf $TEMP_FILE

A mi aplicación Java viene como si fuera un FileUpload común y corriente dentro de un servlet o simil. Utilizo apache file upload.


protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  FileItemFactory factory = new DiskFileItemFactory();
  ServletFileUpload upload = new ServletFileUpload(factory);
  List items = upload.parseRequest(request);
  Iterator iter = items.iterator();
  while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (!item.isFormField()) { // here is the file!
      myFile = item;
    }
  }

  // now process the file

Entonces tenemos con el código de arriba solucionado el recibir el archivo proveniente del CURL request. Ese archivo es plain text y contiene toda la info que contiene un email, header y body.

From root@myserver.com Thu May 13 14:21:16 2010
Received: from myserver.com (localhost.localdomain [127.0.0.1])
by myserver.com (8.13.8/8.13.8) with ESMTP id o4DILgiri383703
for ; Thu, 13 May 2010 14:21:16 -0400
Received: (from root@localhost)
by myserver.com (8.13.8/8.13.8/Submit) id o4DIGIUR89844
for some@otherserver.com; Thu, 13 May 2010 14:21:16 -0400
Date: Thu, 13 May 2010 14:21:16 -0400
From: root 
To: some@otherserver.com
Subject: some subject
Message-ID: <20100513182116.GA873@myserver.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.4.2.2i

here the body of the message

Y aca viene la gran utilidad, para evitar parsear el mensaje y estar luchando con el reply-to, from , y el body construimos un MimeMessage en java el cual nos permite acceder a todos los campos del email sin mayores dolores de cabeza.

Creamos un property y un session para poder pasarlos como parametros al MimeMessage

Properties properties = System.getProperties();
//properties.put("mail.transport.protocol", "smtp"); NO SE SI ES NECESARIO
//properties.put("mail.smtp.host", "localhost");  NO SE SI ES NECESARIO
Session session = Session.getDefaultInstance(properties, null);

Y ahora parseamos el mensaje :D

StringBufferInputStream stream = new StringBufferInputStream(email);
MimeMessage message = new MimeMessage(session, stream);

Y podemos acceder a todos los campos del email

message.getSubject();
message.getSender();
message.getSenderDate();
message.getContent();
//blablabla

Utilizo la API de Java Mail. También quiero agradecer a Pedro Prez de Keetup por la ayuda con CURL.

Categories: java

Rodrigo Asensio

Apasionado por la tecnología

Leave a Reply

Your email address will not be published. Required fields are marked *