【问题标题】:javax.activation.UnsupportedDataTypeException: no object DCH for MIME type text/calendar;method=REQUESTjavax.activation.UnsupportedDataTypeException:没有对象 DCH 用于 MIME 类型文本/日历;方法 = 请求
【发布时间】:2020-06-11 05:06:11
【问题描述】:

我正在尝试使用 java 邮件发送日历会议邀请。但我面临以下错误。我已经搜索了堆栈溢出。所有带有相关错误的答案都是针对邮件的。

对于 MIME 类型文本/日历没有对象 DCH;method=REQUEST

代码:

BodyPart calendarPart = new MimeBodyPart();
calendarPart.addHeader("Content-Class", "urn:content-classes:calendarmessage");
calendarPart.setContent(calendarContent, "text/calendar;method=REQUEST");

Multipart multipart = new MimeMultipart();
multipart.addBodyPart(calendarPart);

MimeMessage message = new MimeMessage(session);
message.addHeaderLine("method=REQUEST");
message.addHeaderLine("charset=UTF-8");
message.addHeaderLine("component=VEVENT");
message.setSubject(meetingSubject);
message.setContent(multipart);

Transport.send(message);

错误跟踪:

  Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type text/calendar;method=REQUEST 
 at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:885) 
 at javax.activation.DataHandler.writeTo(DataHandler.java:316) 
 at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) 
 at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865) 
 at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462) 
 at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:103) 
 at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:883) 
 at javax.activation.DataHandler.writeTo(DataHandler.java:316) 
 at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) 
 at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) 
 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1121) 

【问题讨论】:

标签: java spring-boot jakarta-mail icalendar outlook-calendar


【解决方案1】:

问题已解决。 将邮件更新到 1.4.7。 此外,与 Amazon SES 服务相关的服务器端也存在一些问题。

【讨论】:

    【解决方案2】:

    几天前我遇到了同样的问题,就在今天我找到了一个解决方案,可以 100% 解决我的问题。

    JavaMail 依赖于一些配置文件来将 MIME 类型映射到 Java 类(例如,multipart/mixed 到 javax.mail.internet.MimeMultipart)。这些配置文件是使用应用程序的 ClassLoader 加载的。如果 ClassLoader 不能正常工作(在我的例子中是由于依赖冲突),这些配置文件将找不到。

    只需将以下代码添加到方法的开头即可:

    final MimetypesFileTypeMap mimetypes = (MimetypesFileTypeMap) MimetypesFileTypeMap.getDefaultFileTypeMap();
    mimetypes.addMimeTypes("text/calendar ics ICS");
    final MailcapCommandMap mailcap = (MailcapCommandMap) MailcapCommandMap.getDefaultCommandMap();
    mailcap.addMailcap("text/calendar;; x-java-content-handler=com.sun.mail.handlers.text_plain");
    

    希望现在还为时不晚,希望对大家有所帮助。

    【讨论】:

      【解决方案3】:

      问题在于,没有配置知道如何将 calendarContent 对象(无论是什么)转换为 MIME 类型文本/日历格式的字节流的类。如果您可以自己进行转换,通过将对象转换为字节数组或字符串,那么 JavaMail 无需进一步配置即可处理它。如果您想将系统配置为能够为您进行转换,您需要配置 JavaBeans 激活框架,并且您需要提供一个进行转换的类。由于您只是自己执行此操作,而不是试图让其他人轻松,因此最简单的方法是我首先描述的 - 将 calendarContent 对象转换为字节数组/流或字符串。

      【讨论】:

      • calendarContent 已经是字符串。根据您的建议,我尝试将其转换为字节数组(calendarContent.getBytes()),但仍然是同样的问题。还有其他建议吗?
      • JavaMail 没有任何关于 text/calendar 的特殊知识,并且它不假定 text/* 可以用字符串表示,尽管它可能应该。现在,将 ByteArrayDataSource 与 String 和 MIME 类型 text/calendar 一起使用。使用以下内容设置内容:calendarPart.setDataHandler(new DataHandler( new ByteArrayDataSource(calendarContent, "text/calendar")));
      • 您还需要摆脱所有这些 addHeaderLine 调用;你几乎不应该使用这种方法。相反,您可能需要将这些作为参数添加到 text/calendar MIME 类型。您可以将其作为字符串执行,也可以使用 ContentType 类来确保语法正确。
      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 2014-10-16
      • 2013-08-08
      • 2015-01-06
      • 2019-07-21
      • 2016-02-29
      • 2016-01-11
      • 1970-01-01
      相关资源
      最近更新 更多