Repository: nifi Updated Branches: refs/heads/master 253ea2e73 -> 7c27d4c58
NIFI-3992: Added Original Headers to Include/Exclude Some headers can cause problems with message parsing, specifically the 'Content-Type' header. If an email contains attachments, ConsumeEWS may generate emails where the attachments cannot be extracted. This closes #1867. Signed-off-by: Koji Kawamura <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/7c27d4c5 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/7c27d4c5 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/7c27d4c5 Branch: refs/heads/master Commit: 7c27d4c58872e8f6891ae6735cda409161c1fb6b Parents: 253ea2e Author: patricker <[email protected]> Authored: Tue Jun 20 11:34:54 2017 +0800 Committer: Koji Kawamura <[email protected]> Committed: Fri Jun 23 17:38:19 2017 +0900 ---------------------------------------------------------------------- .../nifi/processors/email/ConsumeEWS.java | 44 ++++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/7c27d4c5/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ConsumeEWS.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ConsumeEWS.java b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ConsumeEWS.java index aeff682..d9a4979 100644 --- a/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ConsumeEWS.java +++ b/nifi-nar-bundles/nifi-email-bundle/nifi-email-processors/src/main/java/org/apache/nifi/processors/email/ConsumeEWS.java @@ -41,6 +41,7 @@ import microsoft.exchange.webservices.data.search.FindItemsResults; import microsoft.exchange.webservices.data.search.FolderView; import microsoft.exchange.webservices.data.search.ItemView; import microsoft.exchange.webservices.data.search.filter.SearchFilter; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.mail.EmailAttachment; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; @@ -50,6 +51,7 @@ import org.apache.nifi.annotation.documentation.CapabilityDescription; import org.apache.nifi.annotation.documentation.Tags; import org.apache.nifi.annotation.lifecycle.OnStopped; import org.apache.nifi.components.PropertyDescriptor; +import org.apache.nifi.components.Validator; import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.processor.AbstractProcessor; import org.apache.nifi.processor.ProcessContext; @@ -175,6 +177,23 @@ public class ConsumeEWS extends AbstractProcessor { .addValidator(StandardValidators.BOOLEAN_VALIDATOR) .build(); + public static final PropertyDescriptor INCLUDE_EMAIL_HEADERS = new PropertyDescriptor.Builder() + .name("ews-include-headers") + .displayName("Original Headers to Include") + .description("Comma delimited list specifying which headers from the original message to include in the exported email message. Blank means copy all headers. " + + "Some headers can cause problems with message parsing, specifically the 'Content-Type' header.") + .defaultValue("") + .addValidator(Validator.VALID) + .build(); + + public static final PropertyDescriptor EXCLUDE_EMAIL_HEADERS = new PropertyDescriptor.Builder() + .name("ews-exclude-headers") + .displayName("Original Headers to Exclude") + .description("Comma delimited list specifying which headers from the original message to exclude in the exported email message. Blank means don't exclude any headers.") + .defaultValue("") + .addValidator(Validator.VALID) + .build(); + static final Relationship REL_SUCCESS = new Relationship.Builder() .name("success") .description("All messages that are the are successfully received from Email server and converted to FlowFiles are routed to this relationship") @@ -195,7 +214,6 @@ public class ConsumeEWS extends AbstractProcessor { protected volatile boolean shouldSetDeleteFlag; protected volatile String folderName; - protected volatile int fetchSize; public ConsumeEWS(){ final Set<Relationship> relationshipSet = new HashSet<>(); @@ -215,6 +233,8 @@ public class ConsumeEWS extends AbstractProcessor { descriptors.add(EWS_URL); descriptors.add(USE_AUTODISCOVER); descriptors.add(SHOULD_MARK_READ); + descriptors.add(INCLUDE_EMAIL_HEADERS); + descriptors.add(EXCLUDE_EMAIL_HEADERS); DESCRIPTORS = descriptors; } @@ -304,6 +324,19 @@ public class ConsumeEWS extends AbstractProcessor { ExchangeService service = this.initializeIfNecessary(context); boolean deleteOnRead = context.getProperty(SHOULD_DELETE_MESSAGES).getValue().equals("true"); boolean markAsRead = context.getProperty(SHOULD_MARK_READ).getValue().equals("true"); + String includeHeaders = context.getProperty(INCLUDE_EMAIL_HEADERS).getValue(); + String excludeHeaders = context.getProperty(EXCLUDE_EMAIL_HEADERS).getValue(); + + List<String> includeHeadersList = null; + List<String> excludeHeadersList = null; + + if (!StringUtils.isEmpty(includeHeaders)) { + includeHeadersList = Arrays.asList(includeHeaders.split(",")); + } + + if (!StringUtils.isEmpty(excludeHeaders)) { + excludeHeadersList = Arrays.asList(excludeHeaders.split(",")); + } try { //Get Folder @@ -323,7 +356,7 @@ public class ConsumeEWS extends AbstractProcessor { for (Item item : findResults) { EmailMessage ewsMessage = (EmailMessage) item; - messageQueue.add(parseMessage(ewsMessage)); + messageQueue.add(parseMessage(ewsMessage,includeHeadersList,excludeHeadersList)); if(deleteOnRead){ ewsMessage.delete(DeleteMode.HardDelete); @@ -367,7 +400,7 @@ public class ConsumeEWS extends AbstractProcessor { return folder; } - public MimeMessage parseMessage(EmailMessage item) throws Exception { + public MimeMessage parseMessage(EmailMessage item, List<String> hdrIncludeList, List<String> hdrExcludeList) throws Exception { EmailMessage ewsMessage = item; final String bodyText = ewsMessage.getBody().toString(); @@ -403,7 +436,10 @@ public class ConsumeEWS extends AbstractProcessor { //sent date mm.setSentDate(ewsMessage.getDateTimeSent()); //add message headers - ewsMessage.getInternetMessageHeaders().forEach(x-> mm.addHeader(x.getName(), x.getValue())); + ewsMessage.getInternetMessageHeaders().getItems().stream() + .filter(x -> (hdrIncludeList == null || hdrIncludeList.isEmpty() || hdrIncludeList.contains(x.getName())) + && (hdrExcludeList == null || hdrExcludeList.isEmpty() || !hdrExcludeList.contains(x.getName()))) + .forEach(x-> mm.addHeader(x.getName(), x.getValue())); //Any attachments if(ewsMessage.getHasAttachments()){
