Вы должны использовать setSubject (String subject, String charset) , который является удобной функцией для этой цели.
Session session=Session.getDefaultInstance(new Properties());
MimeMessage mimeMsg= new MimeMessage(session);
String subject="Herr Müller reist nach \u0141\u00f3d\u017a.";
mimeMsg.setSubject(subject,"utf-8");
System.out.println(subject);
System.out.println(mimeMsg.getHeader("Subject")[0]);
В MimeUtility сказано:
Существует набор методов для кодирования и декодирования заголовков MIME согласно RFC 2047. Обратите внимание, что, как правило, эти методы не нужны при использовании таких методов, как setSubject и setRecipients; JavaMail будет автоматически кодировать и декодировать данные при использовании этих методов «более высокого уровня». Приведенные ниже методы необходимы только при манипулировании необработанными заголовками MIME с использованием методов setHeader и getHeader.
С моей точки зрения, Message.setSubject
должен быть точкой входа для этой цели.
Отображается cp1252
в вашей предметной кодировке, потому что это ваша стандартная кодировка на вашей платформе.
Ваш опубликованный пример является "результатом"
mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));`