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