【问题标题】:How to avoid loading email's content using spring integration mail如何避免使用 spring 集成邮件加载电子邮件的内容
【发布时间】:2020-08-04 11:12:00
【问题描述】:

我正在使用 spring 集成邮件(5.3.1 版本) 我有一个流程:

    IntegrationFlows
    .from(Mail
        .imapIdleAdapter(imapAdapter)
    )
    .filter()
    .filter()
    ...
    .filter()
    .handle(service1)
    .get();

我希望在 service1 中加载电子邮件内容。 我不想加载电子邮件的内容,直到它通过所有过滤器。 我的过滤器只需要知道电子邮件标题。

我尝试使用 DefaultMailHeaderMapper,但电子邮件的内容还是被加载了。我可以使用“mail.debug”=true 在日志中看到它。

我正在调试,根据 AbstractMailReceiver#receive 的来源,将始终加载 MimeMessage 的内容,因为例如 new IntegrationMimeMessage() 使用加载内容的 MimeMessage(MimeMessage message) 构造函数。

有没有办法配置邮件适配器不加载电子邮件的内容?

谢谢!

【问题讨论】:

    标签: spring-integration jakarta-mail


    【解决方案1】:

    请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/mail.html#mail-inbound。尤其是这部分:

    从 5.2 版开始,邮件接收器上提供了 autoCloseFolder 选项。将其设置为 false 不会在获取后自动关闭文件夹,而是将 IntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCE 标头(有关更多信息,请参阅 MessageHeaderAccessor API)填充到从通道适配器发送给生产者的每条消息中。

    然后看看下一节:https://docs.spring.io/spring-integration/docs/current/reference/html/mail.html#mail-mapping

    因此,为了避免急切的内容加载,您应该放弃标头映射器并且不要自动关闭文件夹。这样整个MimeMessage 就作为有效载荷发送。您可能无法对标头执行过滤逻辑,因为未获取消息的内容,因此我们不知道MimeMessage 中有哪些标头。但是,您可以尝试从过滤器中访问它们,但已经针对有效负载 - 而不是标头。

    【讨论】:

    • 感谢您的反馈!但是如果我放弃标头映射器(this.headerMapper == null)然后 AbstractMailReceiver#searchAndFilterMessages 加载它。它调用 AbstractMailReceiver#postProcessFilteredMessages 运行 MimeMessage mimeMessage = new IntegrationMimeMessage((MimeMessage) filteredMessages[i]) (它加载内容);。您知道是否有其他选择可以避免急切的内容加载?
    • 嗯。我懂了。因此,我们独立于配置加载它。可能我们应该考虑在autoCloseFolder == false 和没有headerMapper 时不加载...
    • 您能告诉我在哪里可以创建改进建议请求吗? (如果可能的话)
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 2012-01-16
    • 2014-06-06
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2010-10-13
    • 2013-07-03
    相关资源
    最近更新 更多