在 lambda 控制台中遇到此问题,但在本地可以正常工作 No object dch for mime type multipart/mixed

问题描述 投票:0回答:2

我正在 java quarkus 中创建一个 AWS Lambda 函数。

我使用 java mail 和 Amazon SES 发送电子邮件。

我添加了所有必需的依赖项,并且在通过邮递员进行本地测试时运行完全正常。我收到了电子邮件中的所有 pdf 文件附件。但每当我尝试在 AWS Lambda 控制台中进行测试时,我都会得到以下信息:

mime 类型多部分/混合没有对象 dch

我尝试添加线程来加载类,并且:

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
mc.addMailcap("message/rfc822;; x-java-content- handler=com.sun.mail.handlers.message_rfc822"); 

但目前还没有运气。有人知道解决办法吗?

java amazon-web-services aws-lambda email-attachments amazon-ses
2个回答
0
投票

我对 Java 和 Lambda 相当陌生,但是当 JavaMail 库无法找到指定 MIME 类型的 DataContentHandler 时,会出现错误“no object dch for mime type multipart/mixed”。在这种情况下,在 AWS Lambda 控制台中运行代码时会发生这种情况,但通过 Postman 进行本地测试时不会发生这种情况。这表明 AWS Lambda 控制台中的环境配置可能存在问题。

一种解决方案是确保AWS Lambda函数的部署包中包含必要的库。在本地测试时,所有必需的库可能都存在于类路径中,但在 AWS Lambda 环境中可能并非如此。确保部署包中包含所有必需的依赖项,并且类路径设置正确。

另一个解决方案是显式注册 MIME 类型“multipart/mixed”的 DataContentHandler。这可以通过创建 javax.activation.DataContentHandler 接口的自定义实现并将其注册到 JavaBeans Activation Framework (JAF) 来完成。这是一个示例实现(未经测试的代码):

import javax.activation.*;
import java.io.*;

public class MyDataContentHandler implements DataContentHandler {
    public MyDataContentHandler() {
    }

    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { new DataFlavor("multipart/mixed") };
    }

    public Object getTransferData(DataFlavor flavor, DataSource dataSource)
        throws UnsupportedFlavorException, IOException {
        if (flavor.equals(new DataFlavor("multipart/mixed"))) {
            return dataSource.getInputStream();
        } else {
            throw new UnsupportedFlavorException(flavor);
        }
    }

    public Object getContent(DataSource dataSource) throws IOException {
        return dataSource.getInputStream();
    }

    public void writeTo(Object object, String mimeType, OutputStream outputStream)
        throws IOException {
        throw new UnsupportedEncodingException("writeTo() not supported");
    }
}

然后,在发送电子邮件之前,在 Lambda 函数代码中向 JAF 注册自定义 DataContentHandler:

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
mc.addMailcap("multipart/mixed;; x-java-content-handler=com.example.MyDataContentHandler"); 
CommandMap.setDefaultCommandMap(mc);

这应该为 MIME 类型“multipart/mixed”注册自定义 DataContentHandler 并解决问题。

确保检查 AWS Lambda 环境配置并在部署包中包含所有必需的依赖项,以确保必要的库在运行时可用。


0
投票

我也面临着同样的问题。基于上述解决方案有人能解决这个问题吗?我正在寻找解决方案,请。

© www.soinside.com 2019 - 2024. All rights reserved.