2011-01-06 25 views
5

używam następujący kod, aby wysłać wiadomość mail.Text wysyłanie działa poprawnie, ale mail z załącznikiem nie działa ona daje Exception.How rozwiązać tenMessagingExceptionIOException podczas wysyłania wiadomości w języku Java?

javax.mail.MessagingException: IOException podczas wysyłania wiadomości; wyjątek zagnieżdżony to: javax.activation.UnsupportedDataTypeException: brak obiektu DCH dla typu MIME multipart/mixed; granica = "= ---- _ Part_0_10430987.1294298904906" w com.sun.mail.smtp.SMTPTransport.sendMessage (SMTPTransport.java:676) w javax.mail.Transport.send0 (Transport.java:189) w javax.mail.Transport.send (Transport.java:118) w Gmailer.GMailSender.sendMailAttach (GMailSender.java:114) w SendMail.main (SendMail.java:22) spowodowane przez: javax.activation.UnsupportedDataTypeException : brak obiektu DCH dla typu MIME multipart/mixed; granica = "---- = _ Part_0_10430987.1294298904906" na javax.activation.ObjectDataContentHandler.writeTo (Unknown Source) na javax.activation.DataHandler.writeTo (Unknown Source) na javax.mail.internet.MimeBodyPart.writeTo (MimeBodyPart.java:1403) na javax.mail.internet.MimeMessage.writeTo (MimeMessage.java:1745) na com.sun.mail.smtp.SMTPTransport.sendMessage (SMTPTransport.java:636) ... 4 więcej

mail z kodem Załącznik:

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

Tekst kod wyślij mail:

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

Ślad stosu jest niekompletny, proszę podać pełny. – Kartoch

+0

Duplikat http://stackoverflow.com/questions/1969667/send-a-mail-from-java5-and-java6 – dkarp

Odpowiedz

4

Po pierwsze, można zrobić Twój kod jest trochę bardziej zwięzły dzięki użyciu MimeBodyPart.attachFile() zamiast samodzielnego kodowania DataSource/DataHandler.

Po drugie, spróbuj ustawić nagłówki Content-Type i Content-Disposition na części z odpowiednimi wartościami. (attachFile ustawi Content-Dyspozycja dla Ciebie domyślnie). Na przykład,

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



EDIT:

Po przemyśleniu trochę, to musi być coś nie w porządku z klasy załadunku.Sprawdź numer this other SO thread, aby sprawdzić, czy naprawia on Twoją sytuację. (Ogólny problem: Prawdopodobnie dodatkowa aktywacja.jar w twojej ścieżce klas, kilka innych możliwości również spowodowało to.)

+0

Próbuję tego również .Ale to nie działa dla mnie –

0

Myślę, że program nie jest w stanie znaleźć mail.txt pliku. Podaj poprawną/kompletną ścieżkę. Wyjątkowy stacktrace może dać więcej pomysłu. Jeśli to możliwe, odpowiedz z tym. e.printStacktrace();

+0

Potrafię odczytać plik. Ale nie jestem w stanie go wysłać. –

0

ustawić tę wartość:

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

Sprawdź też ścieżkę do pliku, lub proszę napisać pełną ścieżkę w dzienniku

1

Użyj tego kodu, wstaw ten kod, a następnie chek, który naprawdę działa. Frist, import tego pakietu

 
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

Czy mógłbyś wyjaśnić kod? – Korcholis

0

spróbować określić dokładną ścieżkę do pliku, w mail.txt.
Na przykład, jeśli jest w C: potem iść dalej i obejmują całą drogę jak

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

i należy pamiętać, że czasami mogą wystąpić problemy z ("c:\users\mail.txt") który ma pojedyncze backslashy więc być bezpieczne tylko uczynić je podwójne ukośniki

Zawsze upewnij się, że korzystasz z metody .printStackTrace(), ponieważ pomoże ci to ustalić, gdzie dokładnie pojawi się twój problem, aby podczas wyszukiwania tego problemu dobrze wiedzieć, czego będziesz szukać.

0

Pls odnoszą się do tego linku: http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

Wyjaśnia prawdopodobną przyczynę problemu i ogólnie doradzić rozwiązanie samo.

Napotkałem to samo podczas używania wielbłąda Apache na bezpieczniku jboss. Musiałem zmodyfikować mój pom.xml ... zobacz fragmenty poniżej:

<!-- 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> 
Powiązane problemy