创建mimetype:application / EDIFACT的javax.mail消息

时间:2010-11-11 13:30:54

标签: java javax.mail edifact

我正在开发一个可以通过邮件发送EDIFACT消息的应用程序。 发送和接收邮件没有问题,收到EDIFACT消息(由另一个应用程序发送)也可以。

EDIFACT是将业务发送到业务信息(例如发票)的标准

邮件具有以下结构:

Message-ID: 20101110081058.CLOCKT..SRC.SRCNUMBER.edi01@SENDER.DOMAIN.com
From: EDI-berichten <edi01@SENDER.DOMAIN.com>
Date: Wed, 10 Nov 2010 08:10:57
To: <ekt@DOMAIN.nl>
Subject: INVOIC;SRC
MIME-VERSION: 1.0
Content-type: application/EDIFACT;
  name=message.edi
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="message.edi"
X-OriginalArrivalTime: 10 Nov 2010 07:13:29.0843 (UTC) FILETIME=[C6CCD430:01CB80A6]
X-Virus-Scanned: clamav-milter 0.96.4 at pilot
X-Virus-Status: Clean

在这里您可以找到EDIFACT规范:http://www.faqs.org/rfcs/rfc1767.html

通常,您通过创建MimeMultipart来发送附件,并为此添加文本和附加部分。 但是,edifact消息没有消息部分,只有附件。

当我将附件部分添加到内容中时,如下所示:

MimeBodyPart attachBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileAttach);
attachBodyPart.setDataHandler(new DataHandler(source));
attachBodyPart.setFileName(source.getName());
msg.setContent(attachBodyPart, "application/EDIFACT");

我收到此错误:

javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/EDIFACT
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:930)

...等 最后这个:

Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type application/EDIFACT
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:877)
    at javax.activation.DataHandler.writeTo(DataHandler.java:302)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1383)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1743)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:888)

有没有人有过创建像这样的消息的经验,或者如何为application / EDIFACT等类型创建消息处理程序?

在收到EDIFACT消息并保存附件时我也遇到了问题,它不是以默认方式保存附件,使用:

mp = (Multipart)message.getContent();
BodyPart part = mp.getBodyPart(i);
part.getInputStream()

我不得不使用它(添加此信息,因为它可能导致解决方案):

SharedByteArrayInputStream sbaIs = (SharedByteArrayInputStream)message.getContent()

**编辑2013年3月18日**

对我这里的问题的最小回应是我想出来的原因,最后我把它变成了一个开源项目。它对一些开发人员来说已经很有用了。

所以看看:使用并请反馈:https://github.com/iamit/IAmEdifact

1 个答案:

答案 0 :(得分:2)

昨天很晚我已经完成了解决上述问题的方法。 我无法在互联网上找到合适的答案。 所以我创建了一个页面,其中包含如何执行此操作的步骤(文档未完成,但很快就会完成)

网站:https://sites.google.com/site/edifact4java/home

简而言之,你必须这样做:

  1. 添加DHC(DataContentHandler) MailcapCommandMap
  2. 创建一个 用于mime类型的DataContentHandler 应用/ EDIFACT
  3. 创建一个 MimePart定制 应用/ EDIFACT
  4. 创建一个 DataHandler用于edifact文件或 消息
  5. 创建消息 用于edifact消息的接口
  6. 并将所有这些放在一起,并且.....它有效!!

    一个长难题,这就是为什么我会在网站上记录它的努力。希望某个人,有朝一日可以用它来赚取利润。