web-dev-qa-db-ja.com

javax.activation.UnsupportedDataTypeException:MIMEタイプmultipart / mixedのオブジェクトDCHはありません。境界

現在、私はディレクトリをリッスンするコードを書いています。ディレクトリが.apkファイルで更新されると、この.apkファイルを含むメールをGmailアカウントに送信します。私はJnotifyとJavaメールをプログラムで使用しています。

私が得ているエラーは、

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で提供されている解決策を探しましたが、役に立つものはありませんでした。

前もって感謝します

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

この問題は、以下の2つのステップを踏むことで解決策を得ることができます。

  1. Javaメールが1.4.7であることを確認してください(以前はすべての混乱を招いた1.4.5を使用していました)。 http://www.Oracle.com/technetwork /Java/index-138643.html
  2. メッセージThread.currentThread()。setContextClassLoader(getClass()。getClassLoader());を送信する前に、このコードを追加します。
18
Vidhee

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

私は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>

これで問題が解決し、添付ファイル付きのメールを再度送信できました。

6
Steven Swart

メールを送信する前に現在のスレッドを追加することが解決策です。

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

Androidプロジェクトの場合、プロガードが誤って未使用のクラスを削除した可能性が高いため、コードを直接変更せずに問題を修正するためにプロガードファイルに次の行を追加してください。

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

OSGIでは、次の回避策により、javax.activationバンドルがjavax.mailバンドルから「META-INF/mailcap」リソースをロードできます。

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

Somの回答(MailcapCommandMap)は、Liferay 7.1 ga1のSpring war Portletsで機能しました。ただし、Tomcatのmail.jarTomcat/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>
0
GeneralElektrix

Build.xmlがこれを行う場合:zipfileset src = "javamail-1.4.7/mail.jar" excludes = "META-INF /" **

次に、構成情報を取り除きます。

0
slaman

コードが実行されている環境について詳しく教えてください。どのJDKを使用していますか?アプリケーションサーバーで実行していますか?

JavaBeans Activation Framework(JAF)は、MIMEタイプをそれらを処理するJavaクラス(DataContentHandlers)にマッピングする方法を指示する構成ファイルを探します。ClassLoaderを使用して構成ファイルを見つけます。 ClassLoaderに問題がある場合、構成ファイルが見つからない可能性があります。

here で説明されている回避策を試すこともできますが、もちろん、問題の根本原因を特定する方が良いでしょう。

最後に、これらの 一般的なJavaMailの間違い のいくつかを修正して、プログラムを単純化することもできます。

0
Bill Shannon

Som からの答えは私のために働いた。ただし、JavaMail DSNを使用しているときにマッピングを変更する必要があり、それらのmailcapエントリも必要でした(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");

結局のところ、DSN JARをfatJAR(shadowJar/Gradleを使用)に追加していたことが問題の原因でした。DSNjarのMETA-INF/mailcapがコアのJARを上書きしていました。

0
Ian