1

以前にも同じような質問が何度も聞かれたことは知っていますが、これは少し違うと思います:)

ユーザーのリストにメールを送信するMavenレポートプラグインを作成しています。java5で実行するとコードは正常に機能しているように見えますが、java6では失敗するという問題があります。実際、プラグインはGroovyで記述されており、commons-emailユーティリティを使用してhtmlメッセージを送信します。

HtmlEmail email = new HtmlEmail();
email.setHostName(mailhost);
email.setSmtpPort(mailport);
email.setFrom(args.from);
email.addTo(args.receiver);
email.setSubject(args.subject);
email.setHtmlMsg(args.htmlmessage);
email.setDebug(log.isDebugEnabled());
email.send();

プロジェクトには、javax.mail:mail:1.4.1およびjavax.activation:activation:1.1.1への依存関係があります。

新しいプラグインを使用してMavenプロジェクトを実行すると、java6で次の例外が発生します。

javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; 
boundary="----=_Part_0_11139111.1262007863993"
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676)
at javax.mail.Transport.send0(Transport.java:189)

java5では問題はありません。

次の回避策を試しました。

  1. プログラムでmailcap構成を追加します。

    // add handlers for main mail MIME types
    MailcapCommandMap mc = (MailcapCommandMap)CommandMap.getDefaultCommandMap();
    mc.getMimeTypes().each{ println "Original MIME-TYPE: $it" }
    mc.getAllCommands ("multipart/mixed").each { println "Original COMMAND: $it" }
    
    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("multipart/mixed;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc);
    
    MailcapCommandMap mc2 = (MailcapCommandMap)CommandMap.getDefaultCommandMap();
    mc2.getMimeTypes().each{ println "Replaced MIME-TYPE: $it" }
    mc2.getAllCommands ("multipart/mixed").each { println "Replaced COMMAND: $it" }
    

    これもjava6では機能しませんが、要求されたmimetypeがmailcapに登録されていないことを実際に示しています(「println」ログステートメントのループを参照)。

    Original  MIME-TYPE: image/jpeg
    Original  MIME-TYPE: image/gif
    Original  MIME-TYPE: text/*
    Replaced MIME-TYPE: message/rfc822
    Replaced MIME-TYPE: multipart/*
    Replaced MIME-TYPE: text/plain
    Replaced MIME-TYPE: text/xml
    Replaced MIME-TYPE: multipart/mixed
    Replaced MIME-TYPE: text/html
    Replaced MIME-TYPE: image/jpeg
    Replaced MIME-TYPE: image/gif
    Replaced MIME-TYPE: text/*
    Replaced COMMAND: javax.activation.CommandInfo@1e5d007
    Replaced COMMAND: javax.activation.CommandInfo@bc8f01
    
  2. 「mailcap」というファイルを作成し、プラグインの「META-INF」ディレクトリに配置しました(http://java.sun.com/j2ee/1.4/docs/api/javax/activation/MailcapCommandMap.htmlを参照) 。 。しかし、これはまったく取り上げられません。

だから私の質問は、java5とjava6でコード/構成をどのように機能させるかについて誰かが何か考えを持っているかどうかです:)

4

3 に答える 3

2

最初に、mail.jar、smtp.jar(古い)、またはactivation.jarの他のコピーがないことを確認します。(JDK 1.5に含まれていなかったため、activation.jarをバンドルしている可能性があるため、最後の可能性が最も高いです)。

それが機能しない場合、またはプラグインが実行されている環境が原因でそれを制御できない場合は、メールインスタンスを作成する前に、コンテキストクラスローダーをシステムクラスローダーに明示的に設定してみてください。

参照(ページの終わり): http://old.nabble.com/javax.activation.UnsupportedDataTypeException: -no-object-DCH-for-MIME-type-multipart-mixed-td12523671.html

于 2009-12-28T15:28:36.660 に答える
1

これは、Java を最新の 1.6.0.x にアップグレードすることでも修正できるようになりました。これがいつ修正されたのかはわかりませんが、x=6 から x=27 に変更すると修正されました。

于 2011-09-06T03:01:12.527 に答える
0

Web アプリケーションで作業していてこのエラーが発生した場合は、これを startupservlet の service() に入れると問題が解決します。

Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ) . ありがとう、マーク。

于 2012-03-13T11:07:18.400 に答える