2011-01-06 9 views
5

Я использую следующий код для отправки mail.Text передачи сообщения работает нормально, но почта с приложением не работает он дает Exception.How решить этотMessagingExceptionIOException при отправке сообщения в java?

javax.mail.MessagingException: IOException при отправке сообщения; Вложенное исключение: javax.activation.UnsupportedDataTypeException: нет объекта DCH для MIME-типа multipart/mixed; граница = "---- = _ Part_0_10430987.1294298904906" в com.sun.mail.smtp.SMTPTransport.sendMessage (SMTPTransport.java:676) в javax.mail.Transport.send0 (Transport.java:189) на javax.mail.Transport.send (Transport.java:118) на Gmailer.GMailSender.sendMailAttach (GMailSender.java:114) на SendMail.main (SendMail.java:22) Вызвано: javax.activation.UnsupportedDataTypeException : нет объекта DCH для MIME-типа multipart/mixed; граница = "---- = _ Part_0_10430987.1294298904906" в javax.activation.ObjectDataContentHandler.writeTo (Unknown Source) в javax.activation.DataHandler.writeTo (Unknown Source) в 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 более

почта с приложением код:

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

Текст код почты отправить:

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) { 

} 
} 
+0

След стека является неполным, пожалуйста, укажите полный текст. – Kartoch

+0

Дубликат http://stackoverflow.com/questions/1969667/send-a-mail-from-java5-and-java6 – dkarp

ответ

4

Во-первых, вы могли бы сделать ваш код немного более кратким, используя MimeBodyPart.attachFile() вместо того, чтобы перепутать код DataSource/DataHandler.

Во-вторых, попробуйте установить заголовки Content-Type и Content-Disposition на свою часть вложения с соответствующими значениями. (attachFile установит Content-Disposition для вас по умолчанию). Например,

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



EDIT:

Подумав немного, это должно быть что-то неладно с классом нагрузки.Пожалуйста, проверьте this other SO thread, чтобы узнать, исправит ли он вашу ситуацию. (Общая проблема: возможно, дополнительная активация.jar в вашем пути к классу, а также некоторые другие возможности, которые также могут возникнуть.)

+0

Я пробую это также .Но это не работает для меня –

0

Я думаю, что Ваша программа не может найти файл mail.txt. Пожалуйста, укажите правильный/полный путь. Исключение stacktrace может дать больше идеи. Если возможно, ответьте на это. e.printStacktrace();

+0

Я могу прочитать файл. Но я не могу его отправить –

0

установить это значение:

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

Также проверьте путь к файлу, или, пожалуйста, напишите полный путь в журнале

1

Используйте этот код, чтобы поставить этот код, а затем chek, который действительно работает. Frist, импорт этого пакета

 
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); 
0
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

Не могли бы вы объяснить код? – Korcholis

0

Пытаться определить точный путь файла, в mail.txt.
Например, если он находится в C: затем идти вперед и включают в себя весь путь

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

и обратите внимание, что когда-то у вас могут возникнуть проблемы с ("c:\users\mail.txt"), который имеет одинарные обратную косую черту так, чтобы быть безопасным просто сделать их двойные обратные косые

Также всегда убедитесь, что вы используете метод .printStackTrace(), так как он поможет вам определить, где именно возникнет ваша проблема, чтобы при поиске по этой проблеме вы были в хорошем положении, чтобы точно знать, что именно вы будете искать.

0

Pls относятся к этой ссылке: http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

Это объясняет возможную причину проблемы и в целом рекомендации по разрешению же.

Я столкнулся с этим при использовании верблюда apache на предохранителе jboss. Мне пришлось изменить свой pom.xml ... см. Ниже ниже:

<!-- 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> 
Смежные вопросы