Невозможно получить вложения электронной почты или многокомпонентный контент с помощью Camel-Mail в FuseESB / OSGI
Я создал пакет osgi с верблюдным маршрутом pop3 для чтения писем. При развертывании в servicemix 5.1 вложения читаются правильно, как и ожидалось.
Тем не менее, тот же пакет создает проблему в FuseEsb-7.1.0.fuse-047-1_2013. Содержимое сообщения доступно из обмена верблюдов (в приведенном ниже фрагменте кода переменная contentObject
) появляются с типом "SharedByteArrayInputStream", а не с "javax.mail.Multipart".
Я много гуглил и нашел посты, в которых упоминалась связанная проблема, которая вызвана загрузкой javax.activation другим загрузчиком классов, отличным от javax.mail. Похоже, javax.activation нужно прочитать META-INF/mailcap из артефакта javamail, но он не может его увидеть. Последние версии javax.mail, кажется, исправили MAINFEST для включения mailcap, но, похоже, все еще происходит с FuseESB.
Конфигурация ServiceMix:
- Версия Servicemix = 5.1
- Camel-почта =2.13.2
- Верблюд-жильный =2.13.2
- javax.mail = Java7
- Javax.activation = Java7
Конфигурация FuseEsb:
- Версия FuseESB = 7.1.0
- Camel.mail = 2.10.0.fuse-71-047
- Верблюд-жильный = 2.10.0.fuse-71-047
- Javax.mail = Java7
- javax.activation = Java7
Может кто-нибудь, пожалуйста, помогите мне решить эту проблему? Ниже приведен фрагмент кода для чтения почты и верблюжий маршрут. Пожалуйста, дайте мне знать, если какая-либо дополнительная информация требуется для устранения проблемы. Благодарю.
Фрагмент кода:
package test.mail.attachment;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.MimeMessage;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class MyProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String result = null;
javax.mail.Message message = exchange.getIn().getBody(
javax.mail.Message.class);
if (message instanceof MimeMessage) {
MimeMessage m = (MimeMessage) message;
Object contentObject = m.getContent();
if (contentObject instanceof Multipart) {
Multipart content = (Multipart) contentObject;
int count = content.getCount();
for (int i = 0; i < count; i++) {
BodyPart part = content.getBodyPart(i);
System.out.println(part.getContentType());
if (part.isMimeType("text/plain")) {
result = (String) part.getContent();
break;
}
else
if (part.isMimeType("text/html")) {
result = (String) part.getContent();
}
else
if (part.isMimeType("multipart/alternative")) {
Multipart mp = (Multipart) part.getContent();
String text = null;
for (int i1 = 0; i1 < mp.getCount(); i1++) {
Part bp = mp.getBodyPart(i);
if (bp.isMimeType("text/plain")) {
if (text == null) {
result = (String) bp.getContent();
break;
}
} else if (bp.isMimeType("text/html")) {
result = (String) bp.getContent();
}
}
}
}
}
else
if(contentObject instanceof String) {// a simple text message
result = (String) contentObject;
}
else {
// not a mime message
// logger.log(Level.WARNING,"notme part or multipart {0}",message.toString());
result = null;
}
System.out.println(result);
}
}
}
Код маршрута верблюда
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:camel="http://camel.apache.org/schema/spring" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route id="mailreader">
<from
uri="pop3://mydomain?password=password&username=user1@mydomain&mapMailMessage=false&delete=true&unseen=true&consumer.delay=2000" />
<log message="Transforming input file" />
<process ref="myProcessor" />
<to uri="log:myLog" />
</route>
</camelContext>
<bean id="myProcessor" class="test.mail.attachment.MyProcessor" />
</beans>