use of org.apache.jsieve.exception.SieveException in project zm-mailbox by Zimbra.
the class ZimbraMailAdapter method executeActions.
@Override
public void executeActions() throws SieveException {
try {
handler.beforeFiltering();
String messageId = Mime.getMessageID(handler.getMimeMessage());
// the script contains a single discard action, JSieve returns an empty list.
if (getActions().size() == 0) {
ZimbraLog.filter.info("Discarding message with Message-ID %s from %s", messageId, Mime.getSender(handler.getMimeMessage()));
handler.discard();
return;
}
List<Action> deliveryActions = getDeliveryActions();
if (deliveryActions.isEmpty()) {
// i.e. no keep/fileinto/redirect actions
if (getReplyNotifyRejectActions().isEmpty()) {
// if only flag/tag actions are present, we keep the message even if discard
// action is present
keep(KeepType.EXPLICIT_KEEP);
} else if (!discardActionPresent) {
// else if reply/notify/reject/ereject actions are present and there's no discard, do sort
// of implicit keep
keep(KeepType.EXPLICIT_KEEP);
}
} else {
ListIterator<Action> li = deliveryActions.listIterator(deliveryActions.size());
while (li.hasPrevious()) {
Action lastDeliveryAction = li.previous();
if (lastDeliveryAction instanceof ActionFileInto) {
ActionFileInto lastFileIntoAction = (ActionFileInto) lastDeliveryAction;
if (lastFileIntoAction.isCopy() && !discardActionPresent) {
keep(KeepType.EXPLICIT_KEEP);
}
break;
} else if (lastDeliveryAction instanceof ActionRedirect) {
ActionRedirect lastRedirectAction = (ActionRedirect) lastDeliveryAction;
if (lastRedirectAction.isCopy() && !discardActionPresent) {
keep(KeepType.EXPLICIT_KEEP);
}
break;
}
}
}
for (Action action : actions) {
if (action instanceof ActionKeep) {
if (context == null) {
ZimbraLog.filter.warn("SieveContext has unexpectedly not been set");
keep(KeepType.IMPLICIT_KEEP);
} else if (context.getCommandStateManager().isImplicitKeep()) {
// implicit keep: this means that none of the user's rules have been matched
// we need to check system spam filter to see if the mail is spam
keep(KeepType.IMPLICIT_KEEP);
} else {
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionFileInto) {
ActionFileInto fileinto = (ActionFileInto) action;
String folderPath = fileinto.getDestination();
folderPath = FilterUtil.replaceVariables(this, folderPath);
try {
if (!allowFilterToMountpoint && isMountpoint(mailbox, folderPath)) {
ZimbraLog.filter.info("Filing to mountpoint \"%s\" is not allowed. Filing to the default folder instead.", folderPath);
keep(KeepType.EXPLICIT_KEEP);
} else {
fileInto(folderPath);
}
} catch (ServiceException e) {
ZimbraLog.filter.info("Unable to file message to %s. Filing to %s instead.", folderPath, handler.getDefaultFolderPath(), e);
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionRedirect) {
// redirect mail to another address
ActionRedirect redirect = (ActionRedirect) action;
String addr = redirect.getAddress();
addr = FilterUtil.replaceVariables(this, addr);
ZimbraLog.filter.info("Redirecting message to %s.", addr);
try {
handler.redirect(addr);
} catch (Exception e) {
ZimbraLog.filter.warn("Unable to redirect to %s. Filing message to %s.", addr, handler.getDefaultFolderPath(), e);
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionReply) {
// reply to mail
ActionReply reply = (ActionReply) action;
ZimbraLog.filter.debug("Replying to message");
try {
String replyStrg = FilterUtil.replaceVariables(this, reply.getBodyTemplate());
handler.reply(replyStrg);
} catch (Exception e) {
ZimbraLog.filter.warn("Unable to reply.", e);
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionNotify) {
ActionNotify notify = (ActionNotify) action;
ZimbraLog.filter.debug("Sending notification message to %s.", notify.getEmailAddr());
try {
handler.notify(FilterUtil.replaceVariables(this, notify.getEmailAddr()), FilterUtil.replaceVariables(this, notify.getSubjectTemplate()), FilterUtil.replaceVariables(this, notify.getBodyTemplate()), notify.getMaxBodyBytes(), notify.getOrigHeaders());
} catch (Exception e) {
ZimbraLog.filter.warn("Unable to notify.", e);
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionReject) {
ActionReject reject = (ActionReject) action;
ZimbraLog.filter.debug("Refusing delivery of a message: %s", reject.getMessage());
try {
String msg = FilterUtil.replaceVariables(this, reject.getMessage());
handler.reject(msg, envelope);
handler.discard();
} catch (Exception e) {
ZimbraLog.filter.info("Unable to reject.", e);
keep(KeepType.EXPLICIT_KEEP);
}
} else if (action instanceof ActionEreject) {
ActionEreject ereject = (ActionEreject) action;
ZimbraLog.filter.debug("Refusing delivery of a message at the protocol level");
try {
handler.ereject(envelope);
} catch (ErejectException e) {
// 'ereject' action executed
throw e;
} catch (Exception e) {
ZimbraLog.filter.warn("Unable to ereject.", e);
}
} else if (action instanceof ActionNotifyMailto) {
ActionNotifyMailto notifyMailto = (ActionNotifyMailto) action;
ZimbraLog.filter.debug("Sending RFC 5435/5436 compliant notification message to %s.", notifyMailto.getMailto());
try {
handler.notifyMailto(envelope, notifyMailto.getFrom(), notifyMailto.getImportance(), notifyMailto.getOptions(), notifyMailto.getMessage(), notifyMailto.getMailto(), notifyMailto.getMailtoParams());
} catch (Exception e) {
ZimbraLog.filter.warn("Unable to notify (mailto).", e);
keep(KeepType.EXPLICIT_KEEP);
}
}
}
handler.afterFiltering();
} catch (ServiceException e) {
throw new ZimbraSieveException(e);
}
}
Aggregations