Создайте javax.mail сообщение mimetype: application / EDIFACT - PullRequest
0 голосов
/ 11 ноября 2010

Я работаю над приложением, которое может отправлять сообщения 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 и добавляя к нему текст и часть вложения. Однако в этом сообщении нет части сообщения, только вложение.

когда я добавляю вложение к содержимому, например:

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)

Есть ли у кого-нибудь опыт создания такого сообщения или как создать обработчик сообщений для типа, такого как приложение / EDIFACT?

При получении сообщения EDIFACT и сохранении вложения у меня также возникла проблема: это не способ сохранить вложение по умолчанию, используя:

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

Мне пришлось использовать это вместо (добавление этой информации, потому что это может привести к решению):

SharedByteArrayInputStream sbaIs = (SharedByteArrayInputStream)message.getContent()

** РЕДАКТИРОВАТЬ 18 марта 2013 г. **

Минимальный ответ на мой вопрос был поводом для того, чтобы разобраться в этом, и в конце концов я сделал это с открытым исходным кодом. это уже было полезно для некоторых разработчиков.

Так что посмотрите: используйте и, пожалуйста, отзыв об этом: https://github.com/iamit/IAmEdifact

1 Ответ

2 голосов
/ 22 ноября 2010

Вчера очень поздно я закончил работу над решением описанной выше проблемы.Я не мог найти правильный ответ в Интернете.Поэтому я создал страницу с инструкциями о том, как это сделать (документация еще не полностью завершена, но она скоро будет)

Сайт: https://sites.google.com/site/edifact4java/home

Короче, вам нужно сделатьthis:

  1. Добавить DHC (DataContentHandler) в MailcapCommandMap
  2. Создать DataContentHandler для приложения MIME-типа / EDIFACT
  3. Создать MimePart, настроенный для приложения /EDIFACT
  4. Создание DataHandler для файла или сообщения edifact
  5. Создание интерфейса сообщений для сообщений edifact

И все это вместе, и .....это работает !!

Длинная головоломка, поэтому я стараюсь документировать ее на сайте.Надеюсь, кто-нибудь когда-нибудь сможет извлечь из этого выгоду.

...