Spring integration 尝试使用spring集成消息负载移动电子邮件时发生类异常

Spring integration 尝试使用spring集成消息负载移动电子邮件时发生类异常,spring-integration,Spring Integration,您好,我已按以下方式配置了默认筛选器,如果某些电子邮件具有特定主题或发件人地址,我将尝试使用java mail api将其移动到特定文件夹,如下所示: 筛选器实现: @Bean(name = ImapAdaptersUtil.DEFAULT_FILTER_BEAN_NAME) @Scope(WebApplicationContext.SCOPE_APPLICATION) public MessageSelector defaultFilter() { return message -&g

您好,我已按以下方式配置了默认筛选器,如果某些电子邮件具有特定主题或发件人地址,我将尝试使用java mail api将其移动到特定文件夹,如下所示:

筛选器实现:

@Bean(name = ImapAdaptersUtil.DEFAULT_FILTER_BEAN_NAME)
@Scope(WebApplicationContext.SCOPE_APPLICATION)
public MessageSelector defaultFilter() {
    return message -> {
        if (message.getPayload() instanceof MimeMessage) {
            try {
                String from = Optional.ofNullable(((InternetAddress) ((MimeMessage) message.getPayload()).getFrom()[0]).getAddress()).orElse(GeneralConst.EMPTY_STRING);
                String subject = Optional.ofNullable(((MimeMessage) message.getPayload()).getSubject()).orElse(GeneralConst.EMPTY_STRING);

                if (!from.matches(DELIVERY_ERROR_FROM)
                        && !from.matches(SPAM_FROM)
                        && !subject.matches(DELIVERY_ERROR_SUBJECT)
                        && !subject.matches(OUT_OF_OFFICE)
                        && !subject.matches(SPAM_SUBJECT)) {
                    return true;
                }
            } catch (MessagingException me) {
                throw new ApplicationBusinessException(ApplicationBusinessException.ApplicationBusinessExceptionType.FUNCTIONAL_VIOLATION,
                        "Could not filter incoming email: " + me.getMessage());
            }
        }
        try {
            this.moveMessage(((MimeMessage) message.getPayload()));
        } catch (MessagingException me) {
            throw new ApplicationBusinessException(ApplicationBusinessException.ApplicationBusinessExceptionType.FUNCTIONAL_VIOLATION,
                    "Could not move incoming email: " + me.getMessage());
        }
        return false;
    };
}
private void moveMessage(MimeMessage message) throws MessagingException {
    Folder folder = message.getFolder();
    Store store = folder.getStore();
    Folder[] folders = store.getDefaultFolder().list("*");
    for (Folder folder1 : folders) {
        LOGGER.info("folder name {}", folder1.getName());
    }

    Folder deliveryErrorFolder = store.getFolder("Delivery error");
    if (!deliveryErrorFolder.exists()) {
        if (deliveryErrorFolder.create(Folder.HOLDS_MESSAGES)) {
            deliveryErrorFolder.setSubscribed(true);
            move(message, folder, deliveryErrorFolder);
            LOGGER.info("Delivery error created");
        }
    } else {
        move(message, folder, deliveryErrorFolder);
    }
}

private void move(MimeMessage message, Folder folder, Folder spamFolder) throws MessagingException {
    List<javax.mail.Message> tempList = new ArrayList<>();
    tempList.add(message);
    javax.mail.Message[] tempMessageArray = tempList.toArray(new javax.mail.Message[0]);
    folder.copyMessages(tempMessageArray, spamFolder);
    LOGGER.info("message moved");
}
移动到文件夹实现:

@Bean(name = ImapAdaptersUtil.DEFAULT_FILTER_BEAN_NAME)
@Scope(WebApplicationContext.SCOPE_APPLICATION)
public MessageSelector defaultFilter() {
    return message -> {
        if (message.getPayload() instanceof MimeMessage) {
            try {
                String from = Optional.ofNullable(((InternetAddress) ((MimeMessage) message.getPayload()).getFrom()[0]).getAddress()).orElse(GeneralConst.EMPTY_STRING);
                String subject = Optional.ofNullable(((MimeMessage) message.getPayload()).getSubject()).orElse(GeneralConst.EMPTY_STRING);

                if (!from.matches(DELIVERY_ERROR_FROM)
                        && !from.matches(SPAM_FROM)
                        && !subject.matches(DELIVERY_ERROR_SUBJECT)
                        && !subject.matches(OUT_OF_OFFICE)
                        && !subject.matches(SPAM_SUBJECT)) {
                    return true;
                }
            } catch (MessagingException me) {
                throw new ApplicationBusinessException(ApplicationBusinessException.ApplicationBusinessExceptionType.FUNCTIONAL_VIOLATION,
                        "Could not filter incoming email: " + me.getMessage());
            }
        }
        try {
            this.moveMessage(((MimeMessage) message.getPayload()));
        } catch (MessagingException me) {
            throw new ApplicationBusinessException(ApplicationBusinessException.ApplicationBusinessExceptionType.FUNCTIONAL_VIOLATION,
                    "Could not move incoming email: " + me.getMessage());
        }
        return false;
    };
}
private void moveMessage(MimeMessage message) throws MessagingException {
    Folder folder = message.getFolder();
    Store store = folder.getStore();
    Folder[] folders = store.getDefaultFolder().list("*");
    for (Folder folder1 : folders) {
        LOGGER.info("folder name {}", folder1.getName());
    }

    Folder deliveryErrorFolder = store.getFolder("Delivery error");
    if (!deliveryErrorFolder.exists()) {
        if (deliveryErrorFolder.create(Folder.HOLDS_MESSAGES)) {
            deliveryErrorFolder.setSubscribed(true);
            move(message, folder, deliveryErrorFolder);
            LOGGER.info("Delivery error created");
        }
    } else {
        move(message, folder, deliveryErrorFolder);
    }
}

private void move(MimeMessage message, Folder folder, Folder spamFolder) throws MessagingException {
    List<javax.mail.Message> tempList = new ArrayList<>();
    tempList.add(message);
    javax.mail.Message[] tempMessageArray = tempList.toArray(new javax.mail.Message[0]);
    folder.copyMessages(tempMessageArray, spamFolder);
    LOGGER.info("message moved");
}
我得到一个例外:

Caused by: java.lang.ClassCastException: class org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage cannot be cast to class com.sun.mail.imap.IMAPMessage (org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage and com.sun.mail.imap.IMAPMessage are in unnamed module of loader 'app')
at com.sun.mail.imap.Utility.toMessageSet(Utility.java:85)

嗯。。。您要查找的内容从版本
5.4开始提供:

从5.4版开始,现在可以按原样返回mimessage,而无需进行任何转换或加载内容。此功能通过以下选项组合启用:未提供headerMapper,simpleContent属性为false,autoCloseFolder属性为false


因此,在您的配置中一切都很好-只需要您将项目升级到最新的Spring集成所需的东西。直接使用
5.4.5
或通过各自最新的弹簧靴。

在哪里使用
defaultFilter()
?您最初是如何将邮件消息放入流的?你介意分享一个
ImapMailReceiver
配置吗?嗨,阿泰姆,我更新了我的问题。集成流正在动态注册。我将筛选器作为参数传递。很抱歉,我以前没有headerMapper,因此引发了类强制转换异常。我把它从问题中删除了,我已经完全编辑了我的答案。很抱歉,您当前的
5.3.6
版本没有解决方法:我可以将其与spring boot版本2.2.0.RELEASE一起使用吗?我得到了这个错误:o.s.integration.handler.LoggingHandler:java.lang.NoSuchFieldError:logger位于org.springframework.integration.mail.AbstractMailReceiver.ConnectStoreIfEssential(AbstractMailReceiver.java:330),您可以尝试。尽管对于Spring Boot版本,甚至
5.3.x
都是错误的。。。你绝对需要考虑升级整个Spring Booto版本到LestEI尝试,并且它不起作用。我会考虑升级弹簧靴版。非常感谢。