java 在Lambda控制台中得到这个问题,但在本地它可以工作,对于mime类型multipart/mixed,没有对象dch

pkwftd7m  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(139)

我在Java Quarkus中创建了一个AWS Lambda函数。
我正在使用Java邮件和Amazon SES进行电子邮件。
我添加了所有必需的依赖项,并且在通过postman进行本地测试时运行完全正常。我在电子邮件中获得了所有PDF文件的附件。但是每当我尝试在AWS Lambda控制台中进行测试时,我都会得到以下结果:
无对象dch用于mime类型multipart/mixed
我已经尝试添加线程到加载类,并且:

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");

但目前还没有任何进展有人知道解决办法吗

1aaf6o9v

1aaf6o9v1#

我是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环境配置,并在部署包中包含所有必需的依赖项,以确保必要的库在运行时可用。

相关问题