2011-01-06 48 views
5

我用下面的代碼來發送mail.Text消息發送工作正常,但郵件帶有附件不能正常使用它給Exception.How解決這個在java中發送消息時MessagingExceptionIOException?

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) 在SendMail.main(SendMail.java:22) 上的javax.mail.Transport.send(Transport.java:118) at Gmailer.GMailSender.sendMailAttach(GMailSender.java:114) 由javax.activation.UnsupportedDataTypeException :無MIME類型multipart/mixed的對象DCH; 邊界= 「---- = _ Part_0_10430987.1294298904906」 在javax.activation.ObjectDataContentHandler.writeTo(未知來源) 在javax.activation.DataHandler.writeTo(未知來源) 在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 2011-01-06 07:53:25

+0

重複http://stackoverflow.com/questions/1969667/send-a-mail-from-java5-and-java6的 – dkarp 2011-01-16 11:43:19

回答

4

首先,你可以做您的代碼使用MimeBodyPart.attachFile()而不是自己編寫DataSource/DataHandler代碼更簡潔一點。

其次,嘗試使用適當的值在您的附件部分上設置Content-TypeContent-Disposition標題。 (attachFile將默認設置的內容處置你。)例如,

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



編輯:

思考了一下後,這必須要有些東西不對勁類加載。請檢查this other SO thread以查看它是否可以糾正您的情況。 (一般問題:在類路徑中可能額外的activation.jar;一些其他的可能性也被認爲是導致它)

+0

我嘗試這也。但它不適合我 – 2011-01-08 06:26:10

0

我覺得你的程序將無法找到該文件mail.txt。 請給出正確/完整的路徑。 一個異常stacktrace可以給出更多的想法。 如果可能的話回覆。 e.printStacktrace();

+0

我能看懂file.But我不能夠把它 – 2011-01-07 04:43:02

0

將此值:

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

同時檢查文件的路徑,或請寫完整的路徑在日誌

1

使用該代碼把這些代碼,然後仄是真正的作品。 弗里斯特,導入包

 
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

嘗試定義您的文件,該mail.txt的確切路徑。
例如,如果它是C:然後繼續前進,包括像

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

整個路徑和請注意,有時你可能會遇到問題與("c:\users\mail.txt")具有單反斜線所以是安全的只是讓他們雙反斜線

而且始終確保您使用.printStackTrace()方法,因爲它會幫助你找出哪兒您的問題將出現,這樣當你在這個問題搜索你會在很好的位置,確切地知道你將尋找。

0

請參考此鏈接:http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

它解釋了問題的可能原因和一般建議在解決相同。

我在jboss保險絲上使用apache駱駝時遇到了同樣的情況。我不得不修改我的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>