it-swarm.com.de

javax.activation.UnsupportedDataTypeException: kein Objekt DCH für MIME-Typ multipart/mixed; Grenze

Momentan schreibe ich gerade einen Code, der ein Verzeichnis hört. Wenn das Verzeichnis mit der APK-Datei aktualisiert wird, sende ich eine E-Mail mit dieser APK-Datei an ein Google Mail-Konto. Ich verwende Jnotify und Java Mail in meinem Programm.

Der Fehler, den ich bekomme, ist

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"

Ich habe nach den im stackoverflow angegebenen Lösungen gesucht, aber keine war hilfreich. 

Danke im Voraus 

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

Dieses Problem kann durch die folgenden zwei Schritte gelöst werden.

  1. Stellen Sie sicher, dass Java-Mail 1.4.7 ist (vorher habe ich 1.4.5 verwendet, was zu allen Verwirrungen geführt hat). Laden Sie es von http://www.Oracle.com/technetwork/Java/index-138643.html herunter.
  2. Fügen Sie diesen Code hinzu, bevor Sie die Nachricht senden... Thread.currentThread (). SetContextClassLoader (getClass (). GetClassLoader ());
16
Vidhee

JavaMail benötigt einige Konfigurationsdateien, um MIME-Typen Java-Klassen zuzuordnen (z. B. multipart/mixed zu javax.mail.internet.MimeMultipart). Diese Konfigurationsdateien werden mit dem ClassLoader für die Anwendung geladen. Wenn der ClassLoader nicht ordnungsgemäß funktioniert, werden diese Konfigurationsdateien nicht gefunden.

Sie können einfach unten Zeilen hinzufügen ..., die das Problem lösen.

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

Das Hinzufügen des aktuellen Threads vor dem Senden der E-Mail ist die Lösung: 

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

Ich bin damit beschäftigt, ein Java 8-Projekt in Java 10 zu konvertieren. Gleichzeitig habe ich alle Abhängigkeiten aktualisiert. Ich bekam eine ähnliche Ausnahme und keine der oben genannten Lösungen funktionierte für mich.

Ich habe folgendes in meiner pom.xml:

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

Ich habe etwas recherchiert und den folgenden Link gefunden:

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

Also habe ich versucht, die folgende Abhängigkeit zu meiner pom.xml hinzuzufügen:

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

Das Problem wurde behoben, ich konnte erneut Mail mit Anhängen senden.

2
Steven Swart

Wenn es sich um ein Android-Projekt handelt, ist es sehr wahrscheinlich, dass der Proguard versehentlich nicht verwendete Klassen entfernt hat. Fügen Sie die folgenden Zeilen in die Proguard-Datei ein, um das Problem zu beheben, ohne den Code direkt zu ändern:

-keep class com.Sun.mail.handlers.**
-dontwarn com.Sun.mail.handlers.handler_base
1
Q Locker

Unter OSGI ermöglicht die folgende Problemumgehung, dass das Bundle "javax.activation" die Ressource "META-INF/mailcap" aus dem Bundle "javax.mail" lädt:

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

Soms Antwort (MailcapCommandMap) hat für mich mit Spring-War-Portlets in Liferay 7.1 ga1 funktioniert. Ich musste jedoch Tomcats mail.jar aus Tomcat/lib/ext entfernen und durch javax.mail-1.6.2.jar ersetzen. Dann muss sichergestellt sein, dass die Abhängigkeit gemäß den Angaben in der Projektdatei pom.xml festgelegt ist:

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

Wenn Ihre build.xml das ausführt: Zipfileset src = "javamail-1.4.7/mail.jar" excles = "META-INF/"

Dann entfernen Sie die Konfigurationsinformationen.

0
slaman

Erzählen Sie mir mehr über die Umgebung, in der Ihr Code ausgeführt wird. Welches JDK verwendest du? Laufen Sie auf einem Anwendungsserver?

Das JavaBeans Activation Framework (JAF) sucht nach Konfigurationsdateien, in denen angegeben wird, wie MIME-Typen den Java-Klassen (DataContentHandlers) zugeordnet werden, die sie verarbeiten. Es verwendet den ClassLoader, um die Konfigurationsdateien zu finden. Bei Problemen mit dem ClassLoader werden die Konfigurationsdateien möglicherweise nicht gefunden.

Vielleicht möchten Sie die beschriebene Problemumgehung here ausprobieren, aber es wäre natürlich besser, die Ursache des Problems für Sie zu ermitteln.

Schließlich möchten Sie vielleicht Ihr Programm vereinfachen, indem Sie einige dieser allgemeinen JavaMail-Fehler beheben.

0
Bill Shannon

Die Antwort von Som hat für mich funktioniert. Ich musste jedoch die Zuordnungen ändern, da ich JavaMail DSN verwendete, und brauchte auch diese Mailcap-Einträge (einschließlich der Antwort von 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");

Wie sich herausstellte, fügte das Hinzufügen des DSN-JARs zu meinem fetten JAR (unter Verwendung von shadowJar/Gradle) das Problem hinzu: Der META-INF/mailcap aus dem DSN-Dose überschrieb den Kern. 

0
Ian