【问题标题】:Missing start boundary Exception when sending messages with an attachment file in Tomcat在 Tomcat 中发送带有附件文件的消息时缺少开始边界异常
【发布时间】:2012-05-11 14:53:48
【问题描述】:

我已经找到了许多可能与此问题相关的匹配项,但没有一个对我有用。

我正在使用 Apache Camel 将文件作为电子邮件附件传递。它使用以下 Maven 目标完美运行:

码头:运行 码头:运行爆炸 码头:运行战争

我使用的是 java 1.6。我的部署容器是tomcat6。在 tomcat6 和 tomcat7 中出现以下异常:

org.springframework.mail.MailSendException:消息失败:javax.mail.MessagingException:缺少开始边界;消息异常详细信息(1)是: 失败的消息 1: javax.mail.MessagingException:缺少开始边界 在 javax.mail.internet.MimeMultipart.parsebm(MimeMultipart.java:882)

网络上的建议表明这是一个类加载器问题。要么是activation-1.1.jar或mail-1.4.4.jar文件没找到,要么是mail-1.4.4.jar里面的mailcap文件没找到。

我已经尝试将这些 jar 文件放入 tomcat/lib 中。我已经尝试将 jar 文件中的 mailcap 复制到爆炸战争的 META-INF 目录中。这些都没有影响。

版本:

Windows:Apache Tomcat/7.0.5 JDK 1.6.0_27-b07 Apache Camel 2.8.0-fuse-00-08

Linux - ubuntu 10.04 LTS 附带的版本 - 我稍后会检查并添加。

这是我的骆驼路线的简化版:

<route id="uploadFileForm">
    <from uri="jetty:http://0.0.0.0:9095/premier"/>
    <to uri="velocity:form.html"/>
</route>
<route id="uploadFile">
    <from uri="jetty:http://0.0.0.0:9095/fup"/>
    <to uri="log:mail?showBody=true&amp;showHeaders=true"/>
    <to uri="smtp://localhost"/>
    <setHeader headerName="content-type"><constant>text/plain</constant></setHeader>
    <setBody><constant>Message Sent</constant></setBody>
</route>

这是日志显示的内容:

[4 - seda://mail-ws-audio-files] 邮件信息交换[ExchangePattern:InOut, Headers:{Connection=Keep-Alive, CamelHttpServletRequest=org.eclipse.jetty.servlets.MultiPartFilter$Wrapper@bb32c5 , upfile=D:downloads!37SQFTS.pdf, CamelHttpPath=/fup, subject=BBC Premier League Update - Edition 1, CamelHttpQuery=null, CamelHttpServletResponse=HTTP/1.1 200

, UntilMessage=直到格林威治标准时间 10:30,当第二个公告可用时(仅限周一至周五),主机=localhost:9095,用户代理=Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.1;Trident/4.0;SLCC2; .NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;.NET4.0C;.NET4.0E),Accept-Encoding=gzip,放气,bulletin_type=am,to=julian.cable@ yahoo.com,cc=admin@localhost,breadcrumbId=ID-B1-L0N336601-58958-1335935026761-0-2,CamelHttpUrl=http://localhost:9095/fup,Content-Length=24896,Referer=http:// localhost:9095/premier, from=jfbcable@gmail.com, Accept=image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*, Accept-Language=en-GB, Content-Type=multipart/form-data;边界=----------------------------7dc3a8371906f6,CamelHttpUri=/fup,Cache-Control=no-cache,CamelHttpMethod=POST},BodyType :字符串,正文:亲爱的合作伙伴,

    请在附件中找到我们文件的最新版本。

一个最小的示例 maven 项目是here,而战争是here。如果您在 eclipse 中运行项目或使用

mvn jetty:run

然后使用http://localhost:9095/premier的表格

您将收到“无法联系服务器”异常。但是,如果您将战争部署到 tomcat,您将得到缺少的开始边界异常。如果您编辑 applicationContext.xml 并将 ** 替换为有效值,它实际上会发送一封电子邮件。

有什么想法吗?

【问题讨论】:

  • stackoverflow.com/q/1969667/1002025 高度相关,但我应该在哪里寻找其他 jars 以及在骆驼 spring-dsl 环境中如何设置类加载器?
  • 在拔出霰弹枪之前让我们做一些调试。您应该只在阅读消息时获得异常;您在哪里以及如何阅读信息?会话调试输出显示什么?
  • 我在问题中添加了我的骆驼路线的简化版本。异常发生在 smtp 端点上。日志报告显示标题。
  • Bill - 抱歉,我不知道如何在调试器下运行 tomcat,如果我在 eclipse 中运行骆驼路线,它可以工作。我制作了一个最小版本并放在这里:docs.google.com/open?id=0BwhuUU2g0GM9Um1PdGRHV0tfN1k。如果您使用“mvn jetty:run”运行它,您会收到“无法联系电子邮件服务器”错误。如果将其部署在 tomcat 中,则会出现“缺少边界”错误。如果您编辑 applicationContext.xml 文件中的 **** 位,它实际上应该发送邮件。
  • 抱歉,我对 Camel 一无所知,我需要很长时间才能对您的应用程序进行分类并为您调试它。如果您所做的只是 sending 消息,我不知道您为什么会收到该异常,因为这只发生在解析消息时。也许 Camel 正在创建消息文本本身,然后让 JavaMail 读取并发送它?

标签: spring tomcat jetty jakarta-mail apache-camel


【解决方案1】:

我的问题有一个可行的解决方案,但我的问题没有答案。除了在 Tomcat 中之外,我的原始路由集以我尝试过的所有方式工作,并且不需要(我自己的)java 代码。

我采取了蛮力方法,将码头生成的附件移动到身体上,然后在路线的稍后部分,将其移回附件。它让我得到了我可以部署的东西,但它是一个 hack。

仍在寻找一种方法来部署我在 Tomcat 6 中设置的原始路由。

【讨论】:

  • 看看我上面的答案,我设法让它运行没有任何黑客。
【解决方案2】:

我已经尝试过您的简化骆驼路线示例,它适用于 mvn jetty:run。

在我的 Tomcat 7.0.27、Java 6 中,它确实有效。邮件已正确发送。唯一的区别是我不使用:

mvn install

改为使用:

mvn package

然后将target/test-mail-0.0.1-SNAPSHOT.war复制到Tomcat webapps文件夹,并启动tomcat(bin/startup.sh或bin/startup.bat)。

希望这也适用于您。

我的建议是您选择与我相同的 Tomcat 版本并遵循相同的步骤。

您应该解决的其他问题来源:

  1. 检查是否有环境变量 CATALINA_HOME 或 CATALINA_BASE 毫无疑问地设置为指向其他 Tomcat 安装。
  2. 同样在环境变量中,检查 JRE_HOME 或 JAVA_HOME(使用 JDK 时)和 CLASSPATH 变量的内容。您应该将类​​路径设置为 $JAVA_HOME/jre/lib:$JAVA_HOME/jre/lib/ext:。或 %JAVA_HOME%/jre/lib;%JAVA_HOME%/jre/lib/ext;。 (最后一个点很重要)
  3. 如果您仅在 JRE 上运行,请将 JAVA_HOME/lib 替换为 JRE_HOME。
  4. 您正在运行什么版本的 JVM。我使用的是 Oracle JDK 6。您使用的是 OpenJDK/J9 还是其他?

【讨论】:

  • 感谢您的参与。在 Windows 上,正如我所说,我使用的是 Tomcat/7.0.5 Sun/Oracle JDK 1.6.0_27-b07。在 linux 上,它的 Apache Tomcat/6.0.24 1.6.0_24-b07 Sun Microsystems Inc. 我总是使用 mvn 包,然后使用 web 管理器来上传战争
  • 是的,只是移动到 7.0.27 似乎可以解决它。不适合我的生产环境,但我们会看到。谢谢。
  • 我在 Windows 7、Oracle JDK 6 更新 31 上运行它。我刚刚再次尝试使用 Tomcat 7.0.5,似乎无法开箱即用。 7.0.5 是 beta 不稳定版本。很高兴看到它现在对你有用。
  • 7.0.5 是 xampp 附带的。我用它在我的笔记本电脑上进行测试。这很容易用 7.0.27 替换。生产环境是 ubuntu 10.04 LTS,它有 6.0.24。我将不得不将整个平台向前推进,因此将等待一个很好的理由。 Tomcat 之所以被使用,只是因为 Tech-Ops 以前见过它,而且 Camel Web 控制台还不能与 Karaf 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2015-10-16
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多