This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new b9d6168e10 TIKA-4959: use the Date: transport header when a .msg has 
no MAPI date (#3310)
b9d6168e10 is described below

commit b9d6168e109c966aeb94ffe1ebc41dc341f412d7
Author: Tim Allison <[email protected]>
AuthorDate: Thu Oct 8 14:15:42 2026 -0400

    TIKA-4959: use the Date: transport header when a .msg has no MAPI date 
(#3310)
---
 CHANGES.txt                                           |   4 ++++
 .../tika/parser/microsoft/OutlookExtractor.java       |   8 +++-----
 .../tika/parser/microsoft/OutlookParserTest.java      |  18 ++++++++++++++++++
 .../test-documents/testMSG_dateHeaderOnly.msg         | Bin 0 -> 19968 bytes
 .../test-documents/testMSG_dateHeaderUnparseable.msg  | Bin 0 -> 19968 bytes
 5 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index a8d1fcbf40..2fcd701d48 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,9 @@
 Release 4.2.0 - unreleased
 
+   * OutlookExtractor now falls back to the "Date:" transport header for
+     dcterms:created/modified when a .msg has no MAPI date property; the
+     fallback previously could never match (TIKA-4959).
+
    * Unpack output is a Frictionless Data Package by default on every surface: 
tika-server
      /unpack, tika-app -z/-Z and pipes UNPACK mode, where it is one 
<key>-frictionless.zip per
      container unless outputMode is DIRECTORY. Set unpack-config.outputFormat 
to REGULAR
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
index efecc69494..da4f559791 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java
@@ -553,11 +553,9 @@ public class OutlookExtractor extends 
AbstractPOIFSExtractor {
         } else {
             if (headers != null && headers.size() > 0) {
                 for (Map.Entry<String, String[]> header : headers.entrySet()) {
-                    String headerKey = header.getKey();
-                    if 
(headerKey.toLowerCase(Locale.ROOT).startsWith("date:")) {
-                        String date = 
headerKey.substring(headerKey.indexOf(':') + 1).trim();
-
-                        String d = TikaDates.toMetadataString(date);
+                    String[] values = header.getValue();
+                    if (header.getKey().equalsIgnoreCase("date") && 
values.length > 0) {
+                        String d = TikaDates.toMetadataString(values[0]);
                         if (d != null) {
                             metadata.set(TikaCoreProperties.CREATED, d);
                             metadata.set(TikaCoreProperties.MODIFIED, d);
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
index d7628d0f32..660716d41b 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java
@@ -18,6 +18,7 @@ package org.apache.tika.parser.microsoft;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.StringWriter;
@@ -51,6 +52,23 @@ import org.apache.tika.utils.XMLReaderUtils;
  */
 public class OutlookParserTest extends TikaTest {
 
+    @Test
+    public void testDateFromTransportHeader() throws Exception {
+        //TIKA-4959: test-outlook.msg with the MAPI date properties removed;
+        //only the "Date:" transport header remains
+        Metadata metadata = getXML("testMSG_dateHeaderOnly.msg").metadata;
+        assertNull(metadata.get("mapi:last-modification-time"));
+        assertEquals("2007-04-05T16:26:06Z", 
metadata.get(TikaCoreProperties.CREATED));
+        assertEquals("2007-04-05T16:26:06Z", 
metadata.get(TikaCoreProperties.MODIFIED));
+
+        //same file, Date: header replaced with a non-date: no fallback value 
at all
+        metadata = getXML("testMSG_dateHeaderUnparseable.msg").metadata;
+        assertEquals("not a date at all, sorry, nope",
+                metadata.get(Message.MESSAGE_RAW_HEADER_PREFIX + "Date"));
+        assertNull(metadata.get(TikaCoreProperties.CREATED));
+        assertNull(metadata.get(TikaCoreProperties.MODIFIED));
+    }
+
     @Test
     public void testOutlookParsing() throws Exception {
 
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderOnly.msg
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderOnly.msg
new file mode 100644
index 0000000000..da623857ec
Binary files /dev/null and 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderOnly.msg
 differ
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderUnparseable.msg
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderUnparseable.msg
new file mode 100644
index 0000000000..c4276dea5f
Binary files /dev/null and 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testMSG_dateHeaderUnparseable.msg
 differ

Reply via email to