MessagingExceptionIOException при отправке сообщения в Java? - PullRequest
5 голосов
/ 06 января 2011

Я использую следующий код для отправки почты. Отправка текстового сообщения работает нормально, но почта с вложением не работает, это дает исключение. Как решить эту проблему

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 (неизвестный источник) в javax.activation.DataHandler.writeTo (Неизвестный источник) в javax.mail.internet.MimeBodyPart.writeTo (MimeBodyPart.java:1403) в javax.mail.internet.MimeMessage.writeTo (MimeMessage.java:1745) в 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) {

}
}

Ответы [ 8 ]

4 голосов
/ 06 января 2011

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

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

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

РЕДАКТИРОВАТЬ:

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

1 голос
/ 03 января 2013

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

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 голосов
/ 19 июля 2016

Просьба ссылаться на эту ссылку: http://forum.spring.io/forum/osgi-related/dm-server-general/61205-problems-sending-mime-multipart-mails

Объясняет вероятную причину проблемы и обычно советует по ее устранению.

Я столкнулся с такой же проблемой при использовании apache camel на предохранителе 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>
0 голосов
/ 11 апреля 2013

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

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

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

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

0 голосов
/ 06 февраля 2013
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 голосов
/ 06 января 2011

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

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

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

0 голосов
/ 06 января 2011

Это может произойти из-за проблем с загрузкой классов (дублированные версии активации.jar).См. Например http://forum.springsource.org/archive/index.php/t-69180.html

или Google еще немного

0 голосов
/ 06 января 2011

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

...