javax.mail.NoSuchProviderException: smtp

Si obtienes esta excepción al intentar enviar por JavaMail puede deberse a varios motivos pero los más usuales son:

  • No tienes el mail.jar (o smtp.jar) en el classpath.
  • Tienes varias copias de mail.jar (o smtp.jar) en el classpath.
  • Tienes el mail.jar (o smtp.jar) en el directorio compartido pero no le hace caso. Veamos este tercer caso:

Como sabrás se puede habilitar un directorio compartido (shared en nuestro ejemplo) y todas las clases y jar que contenga es como si estuvieran en el classpath. Esto se hace modificando el archivo conf/catalina.properties como sigue:

shared.loader=${catalina.home}/shared,${catalina.home}/shared/*.jar

De esta forma todo lo que metas en shared está compartido PERO, al menos en Tomcat 6, y por la razón que sea, si metes el mail.jar ahí no le va a hacer caso y te producirá la excepción “javax.mail.NoSuchProviderException: smtp“. Lo más adecuado es meterlo en $CATALINA_HOME/lib.

java.lang.NoClassDefFoundError: javax/mail/Address

Este es la excepción típica que aparece si no tienes las clases de JavaMail en tu classpath. Bájalas de aquí y recuerda que necesitarás si usas una versión del JDK inferior a la 1.6 también necesitarás en tu classpath el JavaBeans Activation Framework.