JAMES-1854 Only discard when Sieve script was executed successfully
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/92515034 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/92515034 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/92515034 Branch: refs/heads/master Commit: 925150346eef13b2ca6908fd42201eacbfcfdfff Parents: 296bb64 Author: Benoit Tellier <[email protected]> Authored: Mon Nov 21 10:40:51 2016 +0700 Committer: Benoit Tellier <[email protected]> Committed: Wed Nov 23 18:19:35 2016 +0700 ---------------------------------------------------------------------- .../apache/james/transport/mailets/Sieve.java | 39 +++++++++++--------- .../mailets/jsieve/delivery/SieveExecutor.java | 9 +++-- 2 files changed, 28 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/92515034/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java index 92c4bc6..b17eea8 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java @@ -84,29 +84,34 @@ public class Sieve extends GenericMailet { @Override public void service(Mail mail) throws MessagingException { - for(MailAddress recipient: mail.getRecipients()) { - executeSieveScript(mail, recipient); - } - mail.setRecipients(keepNonDiscardedRecipients(mail)); + List<MailAddress> recipientsWithSuccessfulSieveExecution = executeRetrieveSuccess(mail); + mail.setRecipients(keepNonDiscardedRecipients(mail, recipientsWithSuccessfulSieveExecution)); } - private void executeSieveScript(Mail mail, MailAddress recipient) { - try { - sieveExecutor.execute(recipient, mail); - } catch (Exception e) { - getMailetContext().getLogger().warn("Failed to execute Sieve script for user " + recipient.asPrettyString(), e); + private List<MailAddress> executeRetrieveSuccess(Mail mail) throws MessagingException { + ImmutableList.Builder<MailAddress> recipientsWithSuccessfulSieveExecution = ImmutableList.builder(); + for(MailAddress recipient: mail.getRecipients()) { + if (sieveExecutor.execute(recipient, mail)) { + recipientsWithSuccessfulSieveExecution.add(recipient); + } } + return recipientsWithSuccessfulSieveExecution.build(); } - - private ImmutableList<MailAddress> keepNonDiscardedRecipients(Mail mail) { + private ImmutableList<MailAddress> keepNonDiscardedRecipients(Mail mail, final List<MailAddress> recipientsWithSuccessfulSieveExecution) { final List<MailAddress> discardedRecipients = retrieveDiscardedRecipients(mail); - return FluentIterable.from(mail.getRecipients()).filter(new Predicate<MailAddress>() { - @Override - public boolean apply(MailAddress input) { - return !discardedRecipients.contains(input); - } - }).toList(); + return FluentIterable.from(mail.getRecipients()) + .filter(discardPredicate(discardedRecipients, recipientsWithSuccessfulSieveExecution)) + .toList(); + } + + private Predicate<MailAddress> discardPredicate(final List<MailAddress> discardedAddressList, final List<MailAddress> discardeableAddressList) { + return new Predicate<MailAddress>() { + @Override + public boolean apply(MailAddress input) { + return !discardeableAddressList.contains(input) || !discardedAddressList.contains(input); + } + }; } private List<MailAddress> retrieveDiscardedRecipients(Mail mail) { http://git-wip-us.apache.org/repos/asf/james-project/blob/92515034/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java index feb9c37..d33f7d6 100644 --- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java +++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java @@ -110,21 +110,24 @@ public class SieveExecutor { } } - public void execute(MailAddress recipient, Mail mail) throws MessagingException { + public boolean execute(MailAddress recipient, Mail mail) throws MessagingException { Preconditions.checkNotNull(recipient, "Recipient for mail to be spooled cannot be null."); Preconditions.checkNotNull(mail.getMessage(), "Mail message to be spooled cannot be null."); - sieveMessage(recipient, mail, log); + return sieveMessage(recipient, mail, log); } - protected void sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException { + protected boolean sieveMessage(MailAddress recipient, Mail aMail, Log log) throws MessagingException { try { ResourceLocator.UserSieveInformation userSieveInformation = resourceLocator.get(recipient); sieveMessageEvaluate(recipient, aMail, userSieveInformation, log); + return true; } catch (ScriptNotFoundException e) { log.info("Can not locate SIEVE script for user " + recipient.asPrettyString()); + return false; } catch (Exception ex) { log.error("Cannot evaluate Sieve script for user " + recipient.asPrettyString(), ex); + return false; } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
