缺少开始边界在Tomcat中发送带附件文件的消息时出现异常

时间:2012-05-02 06:08:38

标签: spring tomcat jetty javamail apache-camel

我发现了一些可能与此问题相匹配但没有一个适合我。

我正在使用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] mail                           INFO  Exchange[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=until 10:30 GMT when a second bulletin is available (Mon-Fri only), Host=localhost:9095, User-Agent=Mozilla/4.0 (compatible; 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, deflate, 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; boundary=---------------------------7dc3a8371906f6, CamelHttpUri=/fup, Cache-Control=no-cache, CamelHttpMethod=POST}, BodyType:String, Body:Dear Partner,

    please find attached the latest edition of our file. 

最小示例maven项目是here,战争是here。如果你在eclipse或

中运行项目
mvn jetty:run

然后使用http://localhost:9095/premier

上的表单

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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我有一个解决问题的方法,但不是我的问题的答案。我的原始路由集在我尝试过的每一种方式都有效,除了在Tomcat中并且不需要java代码(我自己的)。

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

仍在寻找在Tomcat 6中部署原始路由集的方法。

答案 1 :(得分:0)

我已经尝试过你的简化骆驼路线样本,它适用于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上运行,则用JRE_HOME替换JAVA_HOME / lib。
  4. 您正在运行什么版本的JVM。我正在使用Oracle JDK 6.您使用的是OpenJDK / J9还是其他什么东西?