2009-12-28 3 views
1

Je sais que des questions similaires ont été posées à plusieurs reprises befor, mais je pense que celui-slitly différent :)envoyer un mail de java5 et java6

J'écris un plugin rapport Maven qui enverra des courriels à une liste de utilisateurs. J'ai maintenant le problème, que le code semble fonctionner correctement quand je l'exécute avec java5, mais échoue avec java6. le plug-in est actuellement writen Groovy et utilise les utilitaires email communes pour envoyer un message 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(); 

Le projet a des dépendances au javax.mail: mail: 1.4.1 et javax.activation: activation : 1.1.1.

Si je lance un projet Maven en utilisant mon nouveau plugin, que je reçois cette exception avec 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) 

Avec java5 Je n'ai aucun problème.

J'ai essayé les solutions de contournement suivantes:

  1. Ajouter la configuration mailcap programme:

    // 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" } 
    

    Cela ne fonctionne pas non plus avec java6, mais il montre vraiment que le type MIME demandé ne soit pas enregistré dans le mailcap (voir les boucles avec les déclarations du journal '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: [email protected] 
    Replaced COMMAND: [email protected] 
    
  2. J'ai créé un fichier appelé 'mailcap' et l'a placé dans le répertoire META-INF 'du plugin (voir http://java.sun.com/j2ee/1.4/docs/api/javax/activation/MailcapCommandMap.html). Mais ça ne se voit pas du tout.

Alors ma question est, si quelqu'un a une idée sur la façon dont je reçois le code/configuration de travail sur java5 et java6 :)

Répondre

2

Vérifiez d'abord vous assurer qu'il n'y a pas autres copies de courrier .jar, smtp.jar (ancien) ou activation.jar. (Le dernier est le plus probable, car vous avez peut-être associé activation.jar car il n'était pas inclus dans JDK 1.5). Si cela ne fonctionne pas ou si vous ne pouvez pas le contrôler en raison de l'environnement dans lequel votre plugin est exécuté, essayez de définir explicitement votre chargeur de classe de contexte sur le chargeur de classe système avant de créer l'instance de courrier.

Référence (fin de page): http://old.nabble.com/javax.activation.UnsupportedDataTypeException:-no-object-DCH-for-MIME-type-multipart-mixed-td12523671.html.

+1

un cas courant est d'avoir en quelque sorte l'implémentation geronimo de javax.mail, qui est bogué. – Bozho

+4

Merci pour ça! J'ai trouvé le fullanswer sur: http: //blog.hpxn.net/2009/12/02/tomcat-java-6-et-javamail-cant-load-dch/ et a été capable de résoudre le problème en appelant ceci: Thread.currentThread(). setContextClassLoader (getClass(). getClassLoader()) – domi

+0

Ah, le plus excellent –

1

Cela peut maintenant être résolu en mettant java à jour vers la dernière 1.6.0.x. Je ne sais pas quand cela a été corrigé, mais le fait d'aller de x = 6 à x = 27 a résolu cela pour moi.

0

Pour ceux qui travaillent dans les applications Web et qui ont cette erreur, la mettre dans le service de votre startupservlet() résout le problème.

Thread.currentThread(). SetContextClassLoader (getClass(). GetClassLoader()). Merci Marc.