This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch branch_3x
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/branch_3x by this push:
new a7b9b98b5e TIKA-4959: use the Date: transport header when a .msg has
no MAPI date (backport of #3310) (#3505)
a7b9b98b5e is described below
commit a7b9b98b5e418d228418785ef37952db43ca5ad5
Author: Tim Allison <[email protected]>
AuthorDate: Mon Nov 2 12:31:14 2026 -0500
TIKA-4959: use the Date: transport header when a .msg has no MAPI date
(backport of #3310) (#3505)
---
CHANGES.txt | 4 ++++
.../tika/parser/microsoft/OutlookExtractor.java | 6 +++---
.../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(+), 3 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 0a30d3f4b8..17a5a7a84e 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,9 @@
Release 3.4.0 - ???
+ * The Outlook .msg parser falls back to the Date: transport header when a
message has
+ no MAPI date; the header was never matched, so such messages had no
created or
+ modified date (TIKA-4959).
+
* The text/html magic now requires the html tag to end, so an XML file with
an
element such as <htmlPath> in its first 8K is no longer detected as HTML
and sent
to the HTML parser (TIKA-4962).
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 912e8d2585..2e64fd0865 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
@@ -437,9 +437,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[] values = header.getValue();
+ if (header.getKey().equalsIgnoreCase("date") &&
values.length > 0) {
+ String date = values[0];
// See if we can parse it as a normal mail date
try {
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 f6b03aa27b..4502c949e7 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
@@ -17,6 +17,7 @@
package org.apache.tika.parser.microsoft;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.InputStream;
@@ -52,6 +53,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(Metadata.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