javax.activation.UnsupportedDataTypeException: aucun objet DCH pour le type MIME multipart / mixed; boundary


Actuellement, je suis en ligne pour écrire un code qui écoutera un répertoire. lorsque le répertoire est mis à jour avec .fichier apk, je vais envoyer un courrier avec cela .fichier apk sur un compte gmail. J'utilise Jnotify et JAVA Mail dans mon programme.

L'erreur que je reçois est,

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"

J'ai cherché les solutions données dans le stackoverflow pour obtenir de l'aide mais aucune d'entre elles n'a été utile.

Merci d'Avance

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();
    }
}
Author: mortalis, 2014-02-18

11 answers

JavaMail dépend de certains fichiers de configuration pour mapper les types MIME aux classes Java (par exemple, multipart/mixed à javax.mail.internet.MimeMultipart). Ces fichiers de configuration sont chargés à l'aide du ClassLoader de l'application. Si le ClassLoader ne fonctionne pas correctement, ces fichiers de configuration ne seront pas trouvés.

Vous pouvez simplement ajouter des lignes ci-dessous .. qui résout le problème .

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"); 
 38
Author: Som, 2018-04-05 08:25:49

Ce problème peut obtenir une solution en suivant les deux étapes ci-dessous.

  1. Assurez-vous que java mail est 1.4.7.(Auparavant, j'ai utilisé 1.4.5 qui a conduit à toutes les confusions). Téléchargez - le depuis http://www.oracle.com/technetwork/java/index-138643.html
  2. Ajoutez ce morceau de code avant d'envoyer le message:
    Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
 23
Author: Vidhee, 2020-06-16 10:34:05

Ajouter le thread actuel avant d'envoyer l'e-mail est la solution:

Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
 7
Author: Aday, 2015-11-12 18:02:38

Je suis occupé à convertir un projet Java 8 en Java 10. En même temps, j'ai mis à jour toutes les dépendances. Je recevais une exception similaire et aucune des solutions ci-dessus ne fonctionnait pour moi.

J'ai ce qui suit dans mon pom.xml:

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

J'ai fait un peu plus de recherches et trouvé le lien suivant:

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

J'ai donc essayé d'ajouter la dépendance suivante à mon pom.xml:

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

Qui a fixé le problème, j'ai pu envoyer à nouveau du courrier avec des pièces jointes.

 7
Author: Steven Swart, 2018-06-27 04:46:26

Dites-moi en plus sur l'environnement dans lequel votre code s'exécute. Quel JDK utilisez-vous? Êtes-vous en cours d'exécution dans un serveur d'application?

Le JavaBeans Activation Framework (JAF) recherche les fichiers de configuration qui indiquent comment mapper les types MIME aux classes Java (DataContentHandlers) qui les gèrent. Il utilise le ClassLoader pour trouver les fichiers de configuration. S'il y a des problèmes avec le ClassLoader, les fichiers de configuration peuvent ne pas être trouvés.

Vous voudrez peut-être essayer le solution de contournement décrite ici, mais bien sûr, il serait préférable de déterminer la cause racine du problème pour vous.

Enfin, vous voudrez peut-être simplifier votre programme en corrigeant certaines de ces erreurs JavaMail courantes.

 1
Author: Bill Shannon, 2014-02-18 22:01:53

S'il s'agit d'un projet Android, il est fort possible que proguard ait supprimé les classes inutilisées par erreur, veuillez ajouter les lignes suivantes dans le fichier proguard pour résoudre le problème sans modifier directement le code:

-keep class com.sun.mail.handlers.**
-dontwarn com.sun.mail.handlers.handler_base
 1
Author: Q Locker, 2018-08-18 23:56:37

La réponse de Som (MailcapCommandMap) a fonctionné pour moi avec les portlets Spring war dans Liferay 7.1 ga1. Cependant, j'ai dû supprimer mail.jar de Tomcat de tomcat/lib/ext et le remplacer par javax.mail-1.6.2.jar, puis m'assurer que la dépendance est étendue comme prévu dans le pom du projet.xml:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
    <scope>provided</scope>
</dependency>
 1
Author: GeneralElektrix, 2018-09-25 14:28:36

La réponse de Som a fonctionné pour moi. Cependant, j'ai dû modifier les mappages car j'utilisais JavaMail DSN, et j'avais également besoin de ces entrées mailcap (incluses ci-dessous, y compris la réponse 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");

Il s'avère que c'est l'ajout du JAR DSN dans mon gros JAR (en utilisant shadowJar/Gradle) qui a causé le problème: le MÉTA-INF/mailcap du jar DSN écrasait le noyau.

 1
Author: Ian, 2019-01-02 19:29:42

Sous OSGI, la solution de contournement suivante permet le javax.bundle d'activation pour charger la ressource "META-INF / mailcap" à partir du javax.paquet de courrier:

Thread.currentThread().setContextClassLoader(javax.mail.Message.class.getClassLoader());

Remarque : les conversions de jeux de caractères peuvent avoir des limitations avec cette solution de contournement...

 1
Author: metatechbe, 2019-10-15 09:14:55

Si votre build.xml fait cela: zipfileset src="javamail-1.4.7/mail.jar" exclut="META-INF/"**

Ensuite, vous supprimez les informations de configuration.

 0
Author: slaman, 2017-01-27 00:27:35

Même moi j'avais fait face au même problème. J'ai essayé différentes versions de javamail cela n'a pas fonctionné. Le problème était que Transport.send() utilisait la classe MailCapCommandMap du jdk java par défaut (JAVA 8 dans mon cas) qui chargeait des fichiers mailcap obsolètes.

J'ai donc utilisé la dernière version de JAVA après quoi il a utilisé MailCapCommandMapà partir du package activation qui a chargé le fichier mailcap correct.

Si quelqu'un rencontre le même problème à l'avenir, ajoutez simplement un point d'arrêt dans les classes MailCapCommandMap disponibles afin que vous sachiez quel mailcap fichier c'est à l'aide.

 0
Author: Sanjay Shetty, 2020-08-20 12:03:23