How do I set or change the SMTP Message-ID with javax.mail?

I believe this section of the JavaMail FAQ answers your question:

Q: I set a particular value for the Message-ID header of my new message, but when I send this message that header is rewritten.

A: A new value for the Message-ID field is set when the saveChanges method is called (usually implicitly when a message is sent), overwriting any value you set yourself. If you need to set your own Message-ID and have it retained, you will have to create your own MimeMessage subclass, override the updateMessageID method and use an instance of this subclass.

class MyMessage extends MimeMessage {
    ...

    protected void updateMessageID() throws MessagingException {
  setHeader("Message-ID", "my-message-id");
    }
    ...
}

According to Oracle's FAQ, when you send the message or call saveChanges, the Message-Id header set by the updateMessageID() method, which overrides any value you might have already set.

To set your own value, you will need to create a sub-class of MimeMessage and implement your own updateMessageID() function:

class MyMimeMessage extends MimeMessage {
    ...
    protected void updateMessageID() throws MessagingException {
        setHeader("Message-ID", "my-message-id");
    }
    ...
}

I was able to use this technique to suppress or eliminate the Message-Id header like this:

@Override
protected void updateMessageID() throws MessagingException {
    removeHeader("Message-Id");
}

This was useful for Mailgun, which sets the Message-Id themselves if you don't set one.