在java中发送消息时是否有MessagingExceptionIOException?

Kar*_*amu 5 java jakarta-mail

我使用以下代码发送mail.Text消息发送工作正常但邮件附件不工作它给出了Exception.How来解决这个问题

javax.mail.MessagingException:发送消息时发生IOException; 嵌套异常是:javax.activation.UnsupportedDataTypeException:没有对象类型为multipart/mixed的DCH; border ="---- = _ Part_0_10430987.1294298904906"at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676)at javax.mail.Transport.send0(Transport.java:189)at javax.mail .Transport.send(Transport.java:118)位于SendMail.main的Gmailer.GMailSender.sendMailAttach(GMailSender.java:114)(SendMail.java:22)引起:javax.activation.UnsupportedDataTypeException:没有MIME类型的对象DCH多部分/混合; border ="---- = _ Part_0_10430987.1294298904906"at javax.activation.DataDataContentHandler.writeTo(Unknown Source)at javax.activation.DataHandler.writeTo(Unknown Source)at 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());
}
 }
Run Code Online (Sandbox Code Playgroud)

文本邮件发送代码:

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

}
}
Run Code Online (Sandbox Code Playgroud)

dka*_*arp 5

首先,您可以使用MimeBodyPart.attachFile()而不是亲自对DataSource/ DataHandler代码进行整理,从而使代码更加简洁。

其次,尝试使用适当的值在附件部分上设置Content-TypeContent-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\"");
Run Code Online (Sandbox Code Playgroud)



编辑:

经过一番思考,这在类加载中一定是不对的。请检查其他SO线程以查看它是否可以解决您的情况。(一般问题:可能是您的类路径中有一个额外的activation.jar;也有其他可能导致它。)