MessagingException: отсутствует начальная граница при отправке почты с вложением
Я сталкиваюсь с проблемой, о которой здесь неоднократно сообщалось, но решение до сих пор мне не помогло.
Маршрут довольно простой. Он ожидает сообщения электронной почты с конкретными темами, создает PDF-файл из параметров почты и отправляет его обратно отправителю.
Когда я запускаю маршрут как тестовый пример Junit в Eclipse, он работает как чудо, но при запуске его в Tomcat на сервере Linux он вылетает с сообщением "javax.mail.MessagingException: Missing start border", когда он пытается отправить письмо с PDF-вложение.
*) Локальная тестовая среда: Tomcat 8.0.5, Windows 7, Java 1.8.0_20, Camel 2.14.0
*) Серверная среда: Tomcat 8.0.12, Ubuntu Server 14.0.1. LTS, Java 1.8.0_20, Camel 2.14.0
*) Что я уже пробовал: - Использование более новой версии mail.jar (путем обновления до текущей версии Camel) - Помещение mail.jar, активации.jar в Tomcat lib - Установка различных свойств mail.mime.multipart.XXX Все с разными версиями и комбинациями => безуспешно.
Ниже код маршрута, процессора и трассировки стека. На самом деле ничего впечатляющего в этом маршруте...
Есть идеи???
Маршрут:
from("imap://XXXXXXXXXXXXXXXX?" +
"host=XXXXXXXXXXXXXXXXX&" +
"password=XXXXXXXXXX&" +
"delete=true&" +
"consumer.delay=12000&" +
"searchTerm.subjectOrBody=XXXXXXXXXXXXXXXXX&" +
"searchTerm.unseen=true"
)
.routeId(ROUTE_ID)
.process(attachmentProcessor)
.setHeader("to", simple("${in.header.from}"))
.setHeader("from", simple("XXXXXXXXXXXXXXXXX"))
.setHeader("subject", simple("XXXXXXXXXXXXXXXXX"))
.setBody(simple("XXXXXXXXXXXXXXXX"))
.to("smtp://XXXXXXXXXXXXXXXXX")
.log(mailMessage);
;
Часть процессора:
pdfUtil.generateLabels(tempDirPath, year, sequenceNumberStart, numberOfPages);
exchange.getIn().addAttachment(fileName, new DataHandler(new FileDataSource(tempDirPath)));
Страшное исключение...:-(
javax.mail.MessagingException: Missing start boundary
at javax.mail.internet.MimeMultipart.parsebm(MimeMultipart.java:882)
at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:503)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:417)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1354)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1354)
at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2107)
at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2075)
at org.apache.camel.component.mail.DefaultJavaMailSender.send(DefaultJavaMailSender.java:118)
at org.apache.camel.component.mail.MailProducer.process(MailProducer.java:56)
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:143)
at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:307)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:138)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87)
at org.apache.camel.component.mail.MailConsumer.processExchange(MailConsumer.java:287)
at org.apache.camel.component.mail.MailConsumer.processBatch(MailConsumer.java:213)
at org.apache.camel.component.mail.MailConsumer.poll(MailConsumer.java:119)
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187)
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
2 ответа
У меня была именно эта проблема. Проблема была вызвана заголовками входящих изображений, установленных в сообщении In на сервере обмена (border, mime-тип и т. Д.), Которые приводили в замешательство SMTP-сервер при попытке отправить почту.
в attachmentProcessor
использовать Out
сообщение вместо in
для полученного тела. Это создает новое сообщение, которое удаляет все заголовки и т. Д. Из компонента IMAP из компонента.
например:
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody("here's the resulting message");
}
})
Возможные решения:
- См. Отсутствие исключения начальной границы при отправке сообщений с вложенным файлом в Tomcat. Решение предлагает проверить путь к классам.
См. Отсутствует исключение начальной границы при чтении сообщений с вложенным файлом. Решение предлагает установить свойство
mail.mime.multipart.ignoreexistingboundaryparameter
:System.setProperty("mail.mime.multipart.ignoreexistingboundaryparameter", "true");
Я надеюсь, что это помогает.