enonic / xp

Enonic XP
https://enonic.com
GNU General Public License v3.0
201 stars 34 forks source link

Can't send mail with attachment #8293

Closed hjelmevold closed 4 years ago

hjelmevold commented 4 years ago

XP version: 7.3.1 Java version: Tested both in enonic sandbox and standalone with OpenJDK Runtime Environment Zulu11.41+23-CA (build 11.0.8+10-LTS) Installed apps: app-superhero-blog

In a JavaScript controller, trying to send an e-mail with one or more attachments with data from getAttachmentStream() on an image from the default cms repo fails with stack trace. I've verified that getAttachmentStream() returns actual data. If you comment out the line with attachments: … the e-mail will be sent without any issues.

JavaScript controller code, using data from Superhero App as an example:

mailLib.send({
    from: 'email@example.com',
    to: 'email@example.com',
    subject: 'subject',
    body: 'body',
    attachments: [{
        fileName: 'superhero_5.jpg',
        mimeType: 'image/jpeg',
        data: contentLib.getAttachmentStream({
                    key: '/superhero/posts/featured-image/superhero_5.jpg',
                    name: 'superhero_5.jpg'
            });
    }]
});

Stack trace:

2020-08-24 10:21:56,042 WARN  c.enonic.xp.lib.mail.SendMailHandler - Mail could not be sent
com.enonic.xp.mail.MailException: IOException while sending message
    at com.enonic.xp.mail.impl.MailServiceImpl.handleException(MailServiceImpl.java:65)
    at com.enonic.xp.mail.impl.MailServiceImpl.send(MailServiceImpl.java:53)
    at com.enonic.xp.lib.mail.SendMailHandler.send(SendMailHandler.java:116)
    at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$4092$2349A$mail.L:1#send(com.enonic.app.formbuilder:/lib/xp/mail.js:66)
    at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$4084$10077AAAAA$form_response.L:1#sendEmailToRecipients(com.enonic.app.formbuilder:/lib/form-builder/form-response.js:416)
    at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$4065$2855AAAAA$form_response.L:1#receiveForm(com.enonic.app.formbuilder:/lib/form-builder/form-response.js:131)
    at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$4063$837AAA$form_response.L:1#save(com.enonic.app.formbuilder:/lib/form-builder/form-response.js:22)
    at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$4062$5262A$form_part.L:1#post(com.enonic.app.formbuilder:/site/parts/form-part/form-part.js:169)
    at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(Unknown Source)
    at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(Unknown Source)
    at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(Unknown Source)
    at jdk.scripting.nashorn/jdk.nashorn.api.scripting.ScriptObjectMirror.call(Unknown Source)
    at com.enonic.xp.script.impl.value.FunctionScriptValue.call(FunctionScriptValue.java:36)
    at com.enonic.xp.script.impl.executor.ScriptExportsImpl.executeMethod(ScriptExportsImpl.java:59)
    at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.doExecute(ControllerScriptImpl.java:71)
    at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.lambda$execute$0(ControllerScriptImpl.java:36)
    at com.enonic.xp.trace.Tracer.traceEx(Tracer.java:72)
    at com.enonic.xp.trace.Tracer.trace(Tracer.java:51)
    at com.enonic.xp.trace.Tracer.trace(Tracer.java:98)
    at com.enonic.xp.portal.impl.controller.ControllerScriptImpl.execute(ControllerScriptImpl.java:36)
    at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.doRender(DescriptorBasedComponentRenderer.java:75)
    at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.render(DescriptorBasedComponentRenderer.java:43)
    at com.enonic.xp.portal.impl.rendering.DescriptorBasedComponentRenderer.render(DescriptorBasedComponentRenderer.java:22)
    at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.lambda$render$1(RendererDelegateImpl.java:40)
    at java.base/java.util.Optional.map(Unknown Source)
    at com.enonic.xp.portal.impl.rendering.RendererDelegateImpl.render(RendererDelegateImpl.java:40)
    at com.enonic.xp.portal.impl.handler.render.ComponentHandlerWorker.execute(ComponentHandlerWorker.java:123)
    at com.enonic.xp.portal.impl.handler.render.ComponentHandler.doHandle(ComponentHandler.java:66)
    at com.enonic.xp.portal.impl.handler.render.ComponentHandler.doHandle(ComponentHandler.java:23)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:75)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.portal.handler.BasePortalHandler.doHandle(BasePortalHandler.java:46)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.impl.trace.TraceWebFilter.doHandle(TraceWebFilter.java:38)
    at com.enonic.xp.web.handler.BaseWebHandler.handle(BaseWebHandler.java:66)
    at com.enonic.xp.web.impl.handler.WebHandlerChainImpl.handle(WebHandlerChainImpl.java:30)
    at com.enonic.xp.web.impl.handler.WebDispatcherImpl.dispatch(WebDispatcherImpl.java:44)
    at com.enonic.xp.web.impl.handler.WebDispatcherServlet.doHandle(WebDispatcherServlet.java:142)
    at com.enonic.xp.web.impl.handler.WebDispatcherServlet.service(WebDispatcherServlet.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.enonic.xp.web.impl.dispatch.mapping.ServletDefinitionImpl.service(ServletDefinitionImpl.java:40)
    at com.enonic.xp.web.impl.dispatch.pipeline.ServletPipelineImpl.service(ServletPipelineImpl.java:40)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:45)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.portal.impl.idprovider.IdProviderFilter.doHandle(IdProviderFilter.java:45)
    at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
    at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.web.impl.auth.BasicAuthFilter.doHandle(BasicAuthFilter.java:34)
    at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
    at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:33)
    at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:102)
    at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:32)
    at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
    at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:60)
    at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
    at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:65)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at org.eclipse.jetty.servlets.HeaderFilter.doFilter(HeaderFilter.java:117)
    at com.enonic.xp.web.impl.header.HeaderFilterWrapper.doHandle(HeaderFilterWrapper.java:51)
    at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31)
    at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33)
    at com.enonic.xp.web.impl.dispatch.mapping.FilterDefinitionImpl.doFilter(FilterDefinitionImpl.java:41)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:50)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterChainImpl.doFilter(FilterChainImpl.java:36)
    at com.enonic.xp.web.impl.dispatch.pipeline.FilterPipelineImpl.filter(FilterPipelineImpl.java:39)
    at com.enonic.xp.web.impl.dispatch.DispatchServletImpl.service(DispatchServletImpl.java:52)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:763)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:551)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:717)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1610)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1363)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:489)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1580)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1278)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:249)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:500)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javax.mail.MessagingException: IOException while sending message
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1350)
    at com.enonic.xp.mail.impl.MailServiceImpl.doSend(MailServiceImpl.java:77)
    at com.enonic.xp.mail.impl.MailServiceImpl.send(MailServiceImpl.java:49)
    ... 140 common frames omitted
Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
    boundary="----=_Part_12_1210396003.1598257309788"
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:879)
    at javax.activation.DataHandler.writeTo(DataHandler.java:300)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1670)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1880)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1300)
    ... 142 common frames omitted

XP also starts with the following warning in the log… no idea if it's relevant:

2020-08-24 11:35:35,129 WARN  javax.mail - expected resource not found: /META-INF/javamail.default.address.map
hjelmevold commented 4 years ago

First Google result for Exception suggests the problem might have to do with classloader: https://stackoverflow.com/questions/54914584/no-object-dch-for-mime-type-multipart-mixed

rymsha commented 4 years ago

7324