web-dev-qa-db-fra.com

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

Actuellement, je suis en train d'écrire un code qui va écouter un répertoire. lorsque le répertoire est mis à jour avec le fichier .apk, j'envoie un courrier contenant ce fichier .apk à 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();
    }
}
17
Vidhee

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

  1. Assurez-vous que la messagerie Java est bien 1.4.7. (J'utilisais auparavant 1.4.5, ce qui a provoqué toutes les confusions). Téléchargez-le sur http://www.Oracle.com/technetwork/Java/index-138643.html
  2. Ajoutez ce morceau de code avant d’envoyer le message.
16
Vidhee

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 de ClassLoader pour l'application. Si le ClassLoader ne fonctionne pas correctement, ces fichiers de configuration ne seront pas trouvés.

Vous pouvez simplement ajouter les lignes ci-dessous qui résoudront 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"); 
30
Som

Ajouter le fil de discussion actuel avant d'envoyer l'e-mail est la solution: 

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

Je suis en train de convertir un projet Java 8 en Java 10. Parallèlement, 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 le texte suivant 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 j'ai 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>

Cela a résolu le problème, j'ai pu envoyer à nouveau un courrier avec des pièces jointes.

2
Steven Swart

S'il s'agit d'un projet Android, il est fort possible que proguard supprime par erreur les classes inutilisées, 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
Q Locker

La réponse de Som (MailcapCommandMap) a fonctionné pour moi avec les portlets de guerre du printemps à Liferay 7.1 ga1. Cependant, je devais supprimer le mail.jar de Tomcat dans Tomcat/lib/ext et le remplacer par javax.mail-1.6.2.jar, puis vérifier que la dépendance était définie comme indiqué dans le fichier pom.xml du projet:

<dependency>
    <groupId>com.Sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
    <scope>provided</scope>
</dependency>
0
GeneralElektrix

Si votre build.xml fait ceci: Zipfileset src = "javamail-1.4.7/mail.jar" excludes = "META-INF/" **

Ensuite, vous supprimez les informations de configuration.

0
slaman

Parlez-moi davantage de l'environnement dans lequel votre code est exécuté. Quel JDK utilisez-vous? Êtes-vous en cours d'exécution sur un serveur d'applications?

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

Vous voudrez peut-être essayer la solution décrite ici , mais bien entendu, il serait préférable de déterminer la cause première du problème.

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

0
Bill Shannon

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, avec 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");

En fin de compte, le problème était lié à l'ajout du fichier JAR DSN dans mon gros fichier JAR (à l'aide de shadowJar/Gradle): le fichier META-INF/mailcap du fichier jar DSN remplaçait celui de base. 

0
Ian