What could be simplier than sending an email from a command line app in Java? Well, a lot of things. I have an app which works fine in the IDE but fails via the command line with this exception:
javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type text/plain; charset=us-ascii at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:625) at javax.mail.Transport.send0(Transport.java:169) at javax.mail.Transport.send(Transport.java:98)
A quick Google search indicates that this is fairly common. In my case, the command line app runs via [OneJar], though most people have their fun when deploying to their app server. The first thing I tried was downloading activation.jar. I noticed in the IDE I have four different versions of the UnsupportedDataTypeException class. One comes from log4j, two from weblogic, and one from Jetty. I hoped adding a fifth via activation.jar would solve things. Well, no such luck.
Fortunately, I found one person's solution on [JGuru]. Austin Prichard-Levy suggests adding this to your mail script:
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"); CommandMap.setDefaultCommandMap(mc);
I did that, and my app started sending mail. I don't know how or why.