2011-01-06 4 views
5

Io uso il seguente codice per inviare un messaggio mail.Text invio sta lavorando bene, ma mail con allegato non funziona dà l'Exception.How per risolvere questoMessagingExceptionIOException durante l'invio di messaggi in java?

javax.mail.MessagingException: IOException durante l'invio del messaggio; l'eccezione nidificata è: javax.activation.UnsupportedDataTypeException: nessun oggetto DCH per tipo MIME multipart/mixed; boundary = "---- = _ Part_0_10430987.1294298904906" a com.sun.mail.smtp.SMTPTransport.sendMessage (SMTPTransport.java:676) a javax.mail.Transport.send0 (Transport.java:189) a javax.mail.Transport.send (Transport.java:118) a Gmailer.GMailSender.sendMailAttach (GMailSender.java:114) a SendMail.main (SendMail.java:22) causati da: javax.activation.UnsupportedDataTypeException : nessun oggetto DCH per tipo MIME multipart/mixed; boundary = "---- = _ Part_0_10430987.1294298904906" a javax.activation.ObjectDataContentHandler.writeTo (fonte sconosciuta) a javax.activation.DataHandler.writeTo (fonte sconosciuta) a javax.mail.internet.MimeBodyPart.writeTo (MimeBodyPart.java:1403) all'indirizzo javax.mail.internet.MimeMessage.writeTo (MimeMessage.java:1745) in com.sun.mail.smtp.SMTPTransport.sendMessage (SMTPTransport.java:636) ... 4 più

mail con il codice allegato:

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

testo del codice 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

La traccia dello stack è incompleta, si prega di fornire quella completa. – Kartoch

+0

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

risposta

4

In primo luogo, si potrebbe fare il tuo codice un po 'più conciso usando MimeBodyPart.attachFile() invece di litigare il codice DataSource/DataHandler tu stesso.

In secondo luogo, provare a impostare le intestazioni Content-Type e Content-Disposition sulla parte di collegamento con i valori appropriati. (attachFile sarà impostare il Content-Disposition per voi per impostazione predefinita.) Ad esempio,

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



EDIT:

Dopo averci pensato un po ', questo deve essere qualcosa di sbagliato alla classe di carico.Si prega di verificare this other SO thread per vedere se rimedi alla situazione. (Problema generale: Probabilmente un altro activation.jar nel tuo classpath; altre poche possibilità hanno anche pensato di causarlo.)

+0

Provo anche questo .Ma non funziona per me –

0

Penso che il vostro programma non è in grado di trovare il file mail.txt. Si prega di indicare il percorso corretto/completo. Un'eccezione dello stacktrace può dare più idea. Se possibile, rispondi con quello. e.printStacktrace();

+0

Posso leggere il file.Ma non sono in grado di inviarlo –

0

Impostare questo valore:

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

controllare anche il percorso del file, o si prega di scrivere percorso completo nel registro

1

Utilizzare quel codice per inserire quel codice e quindi controllare che funzioni davvero. Frist, importare quel pacchetto

 
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

Puoi spiegare il codice? – Korcholis

0

cercare di definire il percorso esatto del file, il mail.txt.
Per esempio, se si è in C: poi andare avanti e di includere l'intero percorso come

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

e si prega di notare che a volte possono verificarsi problemi con ("c:\users\mail.txt") che ha singole barre rovesciate in modo da essere al sicuro solo renderli doppi backslash

Inoltre, assicurati sempre di utilizzare il metodo .printStackTrace() poiché ti aiuterà a identificare esattamente dove si verificherà il problema, in modo che quando esegui una ricerca su quel problema sarai in una buona posizione per sapere esattamente cosa cercheresti.

0

Pls si riferisce a questo link: http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

Si spiega una causa probabile del problema e, in generale consigliano sulla risoluzione stessa.

Ho incontrato lo stesso mentre si utilizzava apache cammello su jboss. Ho dovuto modificare il mio pom.xml ... vedere i frammenti di seguito:

<!-- 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>