This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit e81edbeda4ec969c1f94eb7144330cbfaf79b8fb Author: Tung Van TRAN <[email protected]> AuthorDate: Thu Jul 28 08:09:35 2022 +0700 JAMES-2340 IsMarkedAsSpam matcher should accept a dynamic spam status header --- .../docs/modules/ROOT/partials/IsMarkedAsSpam.adoc | 11 +++++++++ .../james/transport/matchers/IsMarkedAsSpam.java | 16 +++++++++++-- .../transport/matchers/IsMarkedAsSpamTest.java | 26 ++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/server/apps/distributed-app/docs/modules/ROOT/partials/IsMarkedAsSpam.adoc b/server/apps/distributed-app/docs/modules/ROOT/partials/IsMarkedAsSpam.adoc index 7277a9de01..1f2bf1ee1a 100644 --- a/server/apps/distributed-app/docs/modules/ROOT/partials/IsMarkedAsSpam.adoc +++ b/server/apps/distributed-app/docs/modules/ROOT/partials/IsMarkedAsSpam.adoc @@ -14,4 +14,15 @@ As an example, here is a part of a mailet pipeline which can be used in your Loc <targetFolderName>Spam</targetFolderName> </mailet> <!-- End of SpamAssassing mailets pipeline --> +.... + +In order to use this with `rspamd`, we need to declare a condition for the matcher. +Eg: With the recipient header for RSpamD being *org.apache.james.rspamd.status*, +then the configuration would be: + +.... +<!-- SpamAssassing mailets pipeline --> + <mailet match="IsMarkedAsSpam=org.apache.james.rspamd.status" class="WithStorageDirective"> + <targetFolderName>Spam</targetFolderName> + </mailet> .... \ No newline at end of file diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java index 8c7f0d91e1..a5ef1aac68 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java @@ -21,6 +21,9 @@ package org.apache.james.transport.matchers; import java.util.Collection; import java.util.Locale; +import java.util.Optional; + +import javax.mail.MessagingException; import org.apache.james.core.MailAddress; import org.apache.james.spamassassin.SpamAssassinResult; @@ -51,9 +54,18 @@ public class IsMarkedAsSpam extends GenericMatcher { private static final String YES = "yes"; + private String spamStatusHeader = SpamAssassinResult.STATUS_MAIL.asString(); + @Override public String getMatcherInfo() { - return "Has org.apache.james.spamassassin.status per recipient header with a Yes value"; + return "Has " + spamStatusHeader + " per recipient header with a Yes value"; + } + + @Override + public void init() throws MessagingException { + spamStatusHeader = Optional.ofNullable(getCondition()) + .filter(s -> !s.isEmpty()) + .orElse(SpamAssassinResult.STATUS_MAIL.asString()); } @Override @@ -67,7 +79,7 @@ public class IsMarkedAsSpam extends GenericMatcher { public boolean isMarkedAsSpam(Mail mail, MailAddress recipient) { return mail.getPerRecipientSpecificHeaders().getHeadersForRecipient(recipient) .stream() - .filter(header -> header.getName().equals(SpamAssassinResult.STATUS_MAIL.asString())) + .filter(header -> header.getName().equals(spamStatusHeader)) .anyMatch(header -> header.getValue().toLowerCase(Locale.US).startsWith(YES)); } diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java index d49c66ea2e..5841ee54c9 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java @@ -26,6 +26,7 @@ import org.apache.james.core.MailAddress; import org.apache.mailet.Attribute; import org.apache.mailet.PerRecipientHeaders; import org.apache.mailet.base.test.FakeMail; +import org.apache.mailet.base.test.FakeMatcherConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -151,4 +152,29 @@ class IsMarkedAsSpamTest { Collection<MailAddress> matches = matcher.match(mail); assertThat(matches).contains(new MailAddress("[email protected]")); } + + @Test + void isMarkedAsSpamShouldAcceptDynamicSpamStatusPackageHeader() throws Exception { + FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder() + .matcherName("IsMarkedAsSpam") + .condition("custom.package") + .build(); + + matcher.init(matcherConfig); + + FakeMail mail = FakeMail.builder() + .name("name") + .sender("[email protected]") + .recipient("[email protected]") + .addHeaderForRecipient(PerRecipientHeaders.Header.builder() + .name("custom.package") + .value("Yes, hits=6.8 required=5.0") + .build(), + new MailAddress("[email protected]")) + .attribute(Attribute.convertToAttribute("custom.package", "Yes, hits=6.8 required=5.0")) + .build(); + + Collection<MailAddress> matches = matcher.match(mail); + assertThat(matches).contains(new MailAddress("[email protected]")); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
