Javax.activation.UnsupportedDataTypeException: нет объекта DCH для MIME-типа multipart/mixed; граница

В настоящее время я встроен для написания кода, который будет прослушивать каталог. когда каталог обновлен файлом .apk, я отправлю письмо с этим .apk файлом в учетную запись gmail. Я использую Jnotify и JAVA Mail в своей программе.

Ошибка, которую я получаю,

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"

Я искал решения, предоставленные в stackoverflow для справки, но ни один из них не был полезен.

Спасибо в Advance

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();
    }
}

Ответ 1

Эта проблема может получить решение, выполнив следующие два шага.

  • Убедитесь, что java-почта - 1.4.7. (Предположительно, я использовал 1.4.5, что привело ко всем путаницам). Загрузите его из http://www.oracle.com/technetwork/java/index-138643.html
  • Добавьте этот фрагмент кода перед отправкой сообщения, Thread.currentThread(). SetContextClassLoader (getClass(). GetClassLoader());

Ответ 2

JavaMail зависит от некоторых файлов конфигурации для сопоставления типов MIME с Java-классами (например, multipart/mixed - javax.mail.internet.MimeMultipart). Эти файлы конфигурации загружаются с помощью ClassLoader для приложения. Если ClassLoader не работает должным образом, эти файлы конфигурации не будут найдены.

Вы можете просто добавить строки ниже, что решает проблему.

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

Ответ 3

Добавление текущего потока перед отправкой электронной почты является решением:

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

Ответ 4

Я занят преобразованием проекта Java 8 в Java 10. В то же время я обновляю все зависимости. Я получил подобное исключение, и ни одно из перечисленных выше решений не помогло мне.

В моем pom.xml есть следующее:

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

Я провел немного больше исследований и нашел следующую ссылку:

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

Поэтому я попытался добавить следующую зависимость в свой файл pom.xml:

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

Это устранило проблему, я снова смог отправить почту с вложениями.

Ответ 5

Если это проект андроида, очень вероятно, что proguard по ошибке удалил неиспользуемые классы, добавьте следующие строки в файл proguard, чтобы исправить проблему, не изменяя код напрямую:

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

Ответ 6

Ответ от сома работал на меня. Однако мне пришлось изменить сопоставления, так как я использовал DSN JavaMail, и мне также потребовались эти записи mailcap (включены ниже, включая сом-ответ):

// 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");

Как оказалось, именно добавление DSN файла JAR в мой толстый JAR файл (с использованием shadowJar/Gradle) вызвало проблему: META-INF/mailcap из DSN файла перезаписывал основной.

Ответ 7

В OSGI следующий обходной путь позволяет пакету javax.activation загружать ресурс "META-INF/mailcap" из пакета javax.mail:

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

Примечание: преобразования этого набора символов могут иметь ограничения с этим обходным решением...

Ответ 8

Расскажите подробнее о среде, в которой работает ваш код. Какой JDK вы используете? Вы работаете на сервере приложений?

В платформе активации JavaBeans (JAF) рассматриваются файлы конфигурации, в которых рассказывается, как сопоставлять типы MIME с классами Java (DataContentHandlers), которые обрабатывают их. Он использует ClassLoader для поиска файлов конфигурации. Если возникают проблемы с ClassLoader, файлы конфигурации могут быть не найдены.

Возможно, вы захотите попробовать обходное решение, описанное здесь, но, конечно, было бы лучше определить причину проблемы для вас.

Наконец, вы можете упростить свою программу, исправив некоторые из этих общих ошибок JavaMail.

Ответ 9

Если ваш файл build.xml делает это: zipfileset src= "javamail-1.4.7/mail.jar" исключает = "META-INF/" **

Затем вы удаляете информацию о конфигурации.

Ответ 10

Ответ Som (MailcapCommandMap) работал для меня с MailcapCommandMap Spring War в Liferay 7.1 ga1. Тем не менее, мне пришлось удалить Tomcat mail.jar из tomcat/lib/ext и заменить его на javax.mail-1.6.2.jar, а затем убедитесь, что зависимость ограничена, как указано в проекте pom.xml:

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