java email javamail ioexception jnotify

javax.activation.UnsupportedDataTypeException: ningún objeto DCH para el tipo MIME multiparte/mixto; límite



email javamail (9)

Actualmente estoy en línea de escribir un código que estará escuchando un directorio. cuando el directorio se actualice con el archivo .apk, enviaré un correo con este archivo .apk a una cuenta de gmail. Estoy usando Jnotify y JAVA Mail en mi programa.

El error que estoy recibiendo es,

javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_145238.1392728439484"

Busqué las soluciones proporcionadas en el stackoverflow en busca de ayuda, pero ninguna de ellas me resultó útil.

Gracias por adelantado

public void fileCreated(int wd, String rootPath, String name) { print("created " + rootPath + " : " + name); if (name.contains(".apk")) SendEmail(name); else System.out.println("Not the APK file"); } void SendEmail(String strname){ String Path = "D:/POC/Email/apk folder/"+strname; System.out.println("Path->" + Path); Properties props = new Properties(); props.put("mail.smtp.host","173.194.78.108"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth","true"); props.put("mail.smtp.port","465"); System.out.println("Properties has been set properly"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("[email protected]", "senderPassword"); } } ); System.out.println("Session Created successfully"); try{ Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[email protected]")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]")); message.setSubject("Android : " + strname); MimeBodyPart msgbody = new MimeBodyPart(); msgbody.setText("This is the message content which is sent using JAVA MAIL 1.4.5"); Multipart mulpart = new MimeMultipart(); mulpart.addBodyPart(msgbody); //Attachement Starts here. msgbody = new MimeBodyPart(); javax.activation.DataSource source = new FileDataSource(Path); msgbody.setDataHandler(new DataHandler(source)); msgbody.setFileName(strname); message.setContent(mulpart); System.out.println("Attached the message going to start transporting the mail"); //If I''ve the code before sending the email is getting sent but without attachment. //Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); Transport.send(message); System.out.println("Mail Sent successfully"); } catch(MessagingException msg){ msg.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } }


Agregar la cadena actual antes de enviar el correo electrónico es la solución:

Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );


Dime más sobre el entorno en el que se ejecuta tu código. ¿Qué JDK estás usando? ¿Está ejecutando en un servidor de aplicaciones?

El JavaBeans Activation Framework (JAF) busca archivos de configuración que indican cómo asignar los tipos MIME a las clases de Java (DataContentHandlers) que los manejan. Utiliza el ClassLoader para encontrar los archivos de configuración. Si hay problemas con el ClassLoader, es posible que no se encuentren los archivos de configuración.

Es posible que desee probar la solución que se describe here , pero, por supuesto, sería mejor determinar la causa raíz del problema para usted.

Finalmente, es posible que desee simplificar su programa corrigiendo algunos de estos errores comunes de JavaMail .


Este problema puede obtener una solución siguiendo los dos pasos a continuación.

  1. Asegúrese de que el correo de Java sea 1.4.7. (Anteriormente utilicé 1.4.5, lo que llevó a todas las confusiones). Descárguelo desde http://www.oracle.com/technetwork/java/index-138643.html
  2. Agregue este fragmento de código antes de enviar el mensaje, Thread.currentThread (). SetContextClassLoader (getClass (). GetClassLoader ());

Estoy ocupado convirtiendo un proyecto Java 8 a Java 10. Al mismo tiempo, he estado actualizando todas las dependencias. Estaba recibiendo una excepción similar y ninguna de las soluciones anteriores funcionó para mí.

Tengo lo siguiente en mi pom.xml:

<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.1</version> </dependency>

Hice un poco más de investigación y encontré el siguiente enlace:

http://www.jguru.com/faq/view.jsp?EID=237257

Así que intenté agregar la siguiente dependencia a mi pom.xml:

<dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>

Eso solucionó el problema, pude enviar correos con archivos adjuntos nuevamente.


JavaMail depende de algunos archivos de configuración para asignar tipos MIME a clases Java (por ejemplo, multipart/mixed to javax.mail.internet.MimeMultipart ). Estos archivos de configuración se cargan utilizando el ClassLoader para la aplicación. Si el ClassLoader no funciona correctamente, no se encontrarán estos archivos de configuración.

Simplemente puede agregar las siguientes líneas ... que resuelven el problema.

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content- handler=com.sun.mail.handlers.message_rfc822");


La respuesta de Som ( MailcapCommandMap ) me funcionó con los Portlets de la guerra de primavera en Liferay 7.1 ga1. Sin embargo, tuve que eliminar el mail.jar de mail.jar de Tomcat de tomcat/lib/ext y reemplazarlo con javax.mail-1.6.2.jar , luego asegurarme de que la dependencia esté dentro del alcance que se proporciona en el pom.xml del proyecto:

<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> <scope>provided</scope> </dependency>


La respuesta de Som funcionó para mí. Sin embargo, tuve que modificar las asignaciones ya que estaba usando JavaMail DSN, y también necesitaba esas entradas de correo (incluidas a continuación, incluida la respuesta de Som):

// Original answer from Som: MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); // Additional elements to make DSN work mc.addMailcap("multipart/report;; x-java-content-handler=com.sun.mail.dsn.multipart_report"); mc.addMailcap("message/delivery-status;; x-java-content-handler=com.sun.mail.dsn.message_deliverystatus"); mc.addMailcap("message/disposition-notification;; x-java-content-handler=com.sun.mail.dsn.message_dispositionnotification"); mc.addMailcap("text/rfc822-headers;; x-java-content-handler=com.sun.mail.dsn.text_rfc822headers");

Resulta que, al agregar el DSN JAR a mi gordo JAR (usando shadowJar / Gradle), causó el problema: el META-INF / mailcap del tarro de DSN estaba sobrescribiendo el núcleo.


Si es un proyecto de Android, es muy posible que el programa elimine las clases no utilizadas por error, agregue las siguientes líneas en el archivo de proguard para solucionar el problema sin modificar el código directamente:

-keep class com.sun.mail.handlers.** -dontwarn com.sun.mail.handlers.handler_base


Si su build.xml hace esto: zipfileset src = "javamail-1.4.7 / mail.jar" excluye = "META-INF / " **

Entonces estás eliminando la información de configuración.