5
votes

I use the following code to send mail.Text message sending is working fine but Mail with attachment is not working it gives the Exception.How to solve this

javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_10430987.1294298904906" at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676) at javax.mail.Transport.send0(Transport.java:189) at javax.mail.Transport.send(Transport.java:118) at Gmailer.GMailSender.sendMailAttach(GMailSender.java:114) at SendMail.main(SendMail.java:22) Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_10430987.1294298904906" at javax.activation.ObjectDataContentHandler.writeTo(Unknown Source) at javax.activation.DataHandler.writeTo(Unknown Source) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:636) ... 4 more

Mail with Attachment code :

public synchronized void sendMailAttach(String subject, String body,
    String sender, String recipients)  {
try {
    MimeMessage message = new MimeMessage(session);

    message.setSender(new InternetAddress(sender));
    message.setSubject(subject);

    // Create the message part 
    BodyPart messageBodyPart = new MimeBodyPart();

    // Fill the message
    messageBodyPart.setText("hi Demo");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Part two is attachment
    messageBodyPart = new MimeBodyPart();
    String filename = "mail.txt";
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);

    // Put parts in message
    message.setContent(multipart);

    if (recipients.indexOf(',') > 0)
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(recipients));
    else
        message.setRecipient(Message.RecipientType.TO,
                new InternetAddress(recipients));
    Transport.send(message);

}
catch (MessagingException e) {
    System.out.println("MessagingException" + e.getMessage());
}
catch (Exception e) {
    System.out.println("Mail Send Exception " + e.getMessage());
}
 }

Text Mail send code:

public synchronized void sendMail(String subject, String body,
    String sender, String recipients) throws Exception {
try {
    MimeMessage message = new MimeMessage(session);
    DataHandler handler = new DataHandler(new ByteArrayDataSource(
            body.getBytes(), "text/plain"));
    message.setSender(new InternetAddress(sender));
    message.setSubject(subject);
    message.setDataHandler(handler);
    if (recipients.indexOf(',') > 0)
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(recipients));
    else
        message.setRecipient(Message.RecipientType.TO,
                new InternetAddress(recipients));
    Transport.send(message);
} catch (Exception e) {

}
}
8
Stack trace is incomplete, please give the full one. - Kartoch

8 Answers

6
votes

Firstly, you could make your code a little more concise by using MimeBodyPart.attachFile() instead of wrangling the DataSource/DataHandler code yourself.

Secondly, try setting the Content-Type and Content-Disposition headers on your attachment part with appropriate values. (attachFile will set the Content-Disposition for you by default.) For instance,

messageBodyPart = new MimeBodyPart();
messageBodyPart.attachFile(new File("mail.txt"));
messageBodyPart.setHeader("Content-Type", "text/plain; charset=\"us-ascii\"; name=\"mail.txt\"");



EDIT:

After thinking a bit, this has to be something amiss with class loading. Please check this other SO thread to see if it remedies your situation. (General issue: Probably an extra activation.jar in your classpath; a few other possibilities also thought to cause it.)

1
votes

Use that code put that code and then chek that is really works. Frist, import that package

import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;

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);
1
votes

Set this value:

message.setContent(body, "text/html; charset=UTF-8");    
messageBodyPart.setContent(body, "text/html; charset=UTF-8");

Also check the file path, or please write complete path in your log

0
votes

I think Your program is not able to find the file mail.txt. Please give correct/complete path. An exception stacktrace can give more idea. If possible reply with that. e.printStacktrace();

0
votes

This may stem from class loading issues (duplicat versions of activation.jar). See for example http://forum.springsource.org/archive/index.php/t-69180.html

or google some more

0
votes
static {
     // add handlers for main MIME types
    MailcapCommandMap mcap = new MailcapCommandMap();
    mcap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    mcap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
    mcap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
    mcap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true");
    mcap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mcap);
}
0
votes

Try to define the exact path of your file, the mail.txt.
For example if it is in C: then go ahead and include the whole path like

 String filename = ("c:\\users\\mail.txt"); 

and please note that sometime you might experience problems with ("c:\users\mail.txt") which has single backslashes so to be safe just make them double backslashes

Also always make sure you use .printStackTrace() method since it will help you identify where exactly your problem will be arising so that when you search on that problem you will be in good position to know exactly what you will be looking for.

0
votes

Pls refer to this link: http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

It explains a probable cause of the problem and generally advise on resolving same.

I encountered same while using apache camel on jboss fuse. I had to modify my pom.xml... see snippets below:

    <!-- add a depency on javax.mail, in addition to the dependency on camel-mail -->

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-mail</artifactId>
        <version>2.10.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.5.1</version>
    </dependency>

    <!-- explicitly import the com.sun.mail.handlers package under the Import-Package section of the pom.xml -->

    <Import-Package>com.sun.mail.handlers, *</Import-Package>