You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "vincent royer (Jira)" <se...@james.apache.org> on 2026/06/30 20:09:00 UTC
[jira] [Created] (JAMES-4214) Sieve MessageMatcher failed for simple Mime message
vincent royer created JAMES-4214:
------------------------------------
Summary: Sieve MessageMatcher failed for simple Mime message
Key: JAMES-4214
URL: https://issues.apache.org/jira/browse/JAMES-4214
Project: James Server
Issue Type: Bug
Components: Matchers/Mailets (bundled), sieve
Affects Versions: 3.9.0
Environment: apache james 3.9.0
Reporter: vincent royer
Attachments: bodyTextMatchBitcoin.script, titi-1.eml
When processing a simple text mail with the following SIEVE filter, it does not match the content because the inputstream is already closed when searching for the keyword in the message body. With a multi-part message, there is no issue and the SIEVE filter match the keyword. Please find the raw mail tit.eml in attachment to reproduce the issue.
{quote}require "fileinto";
require "body";
if body :content "text/plain" :contains "bitcoin" {
fileinto "INBOX.select";
} else {
fileinto "INBOX.not.selected";
}
{quote}
The issue is not located in mime4j, the following unit test works well in org.apache.james.mime4j.utils.search.MessageMatcherTest
{quote}{{@Test}}
{{public void isFoundInShouldBeAbleToLocateTextFragments2() throws Exception {}}
{{ MessageMatcher messageMatcher = MessageMatcher.builder()}}
{{ .searchContents(Lists.<CharSequence>newArrayList("bitcoin"))}}
{{ .caseInsensitive(false)}}
{{ .includeHeaders(false)}}
{{ .contentTypes(ImmutableList.of("text/plain"))}}
{{ .build();}}
{{ assertThat(messageMatcher.messageMatches(getResourceStream("titi.eml"))).isTrue();}}{quote}
{quote}{{}}}{quote}
The issue really happens when reading a single-part text/plain message from a mailet, it seems the underlying input stream does not reset the read bytes, so the isFound() does not read anything at all.
You can add the following test in the SieveIntegrationTest class, it does not work.
{{@Test}}
{{void bodyTextShouldMatchContentWithBitcoin() throws Exception {}}
{{ prepareTestUsingScript("org/apache/james/transport/mailets/delivery/bodyTextMatchBitcoin.script");}}{{ }}
{{FakeMail mail = FakeMail.builder()}}
{{ .name("name")}}
{{ .mimeMessage(MimeMessageUtil.mimeMessageFromStream(}}
{{ ClassLoader.getSystemResourceAsStream("eml/titi.eml")))}}
{{ .state(Mail.DEFAULT)}}
{{ .recipient(RECEIVER_DOMAIN_COM)}}
{{ .sender("sender@any.com")}}
{{ .build();}}
{{ testee.service(mail);}}{{ assertThatAttribute(mail.getAttribute(ATTRIBUTE_NAME)).isEqualTo(ATTRIBUTE_SELECTED_MAILBOX);}}
{{}}}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org