bbottema/simple-java-mail

Enhancement: Process all Outlook message headers, either copying the as-is or translating them to respective Simple Java Mail API calls

rehollman opened this issue · 3 comments

When using the EmailConverter.outlookMsgToEmail method, the headers are missing in the Email object returned. Below is a sample which shows the headers are retrieved when using OutlookMessageParser's parseMsg however using the same input file with EmailConverter shows no headers are retrieved.

package com.test;

import java.io.File;
import java.io.IOException;

import org.simplejavamail.api.email.Email;
import org.simplejavamail.converter.EmailConverter;
import org.simplejavamail.outlookmessageparser.OutlookMessageParser;

public class TestEmailHeaders {

  public static void main(String[] args) {
    OutlookMessageParser msgp = new OutlookMessageParser();
    org.simplejavamail.outlookmessageparser.model.OutlookMessage msg;
    
    String inputFileName = "YourEmailFile.msg"; //  <--- Update this with the name of an Outlook email file (.msg) on your system.

    try {
      msg = msgp.parseMsg(inputFileName);
      System.out.println(">>> Headers from msg: " + msg.getHeaders());
      
      Email email = EmailConverter.outlookMsgToEmail(new File(inputFileName));
      System.out.println(">>> Headers from email: " + email.getHeaders());
      
    } catch (IOException e) {
      // This should never occur during this test.
      e.printStackTrace();
    }

  }
}

In the output from the above, you will notice that the ">>> Headers from msg:" is followed by a number of headers but the ">>> Headers from email: {}" indicates that there are no headers returned from the Email's getHeaders() method.

The problem may stem from the buildEmailFromOutlookMessage method in org/simplejavamail/internal/outlooksupport/converter/OutlookEmailConverter which does not appear to copy the headers from the OutlookMessage to the Email object after converting them from a string.

Correct you are... hmm, I wonder why I left it out.

So as I started adding the proper headers to both outlook-message-parser and mapping the to Email objects, I realized they should be processed exactly the same way as headers from MimeMessage are. Which is that some headers should not be copied as-is, but translated to the Simple Java Mail version of it. Examples of this are dispositionNotificationTo, bounceToRecipient and some others.

On top of that I ran into CRLF injection detection issues due to headers coming back differently from Outlook and MimeMessages (having to do with MimeUtility.encoding/folding).

It was quite a challenge to get everything working finally, but I think I nailed it now. Going to release soon.

Released in 7.4.0