Тема является заголовком.Заголовки используют только ascii-7, поэтому для правильного кодирования ни одного символа ascii-7 не следует использовать правильное кодирование.
Если используемый вами класс позволяет указать некоторую попытку кодирования с UTF-8.
mimeMessage.setSubject(yourSubject, "UTF-8");
Если вы пишете заголовки вручную, используйте любой из следующих способов:
MimeUtility.encodeWord(yourSubject, "UTF-8", "B"); // base-64
MimeUtility.encodeWord(yourSubject, "UTF-8", "Q"); // quoted-printable
Это более или менее то, что MimeMessage делает в setSubject (str, encoding):
setHeader("Subject", MimeUtility.fold(9, MimeUtility.encodeText(subject, charset, null)));
// fold splits the value in several lines with no more than 72 chars
Образец
Я пробовал это:
public static void main(String[] args) throws Exception {
// manual encoding
System.out.println(MimeUtility.encodeText("How to include £ pound symbol", "UTF-8", "Q"));
System.out.println(MimeUtility.encodeText("How to include £ pound symbol", "UTF-8", "B"));
// MimeMessage encoding
MimeMessage m = new MimeMessage((Session) null);
m.setSubject("How to include £ pound symbol", "UTF-8");
m.setContent("lalala", "text/plain");
m.writeTo(System.out);
}
и вывод был:
=?UTF-8?Q?How_to_include_=C2=A3_pound_symbol?=
=?UTF-8?B?SG93IHRvIGluY2x1ZGUgwqMgcG91bmQgc3ltYm9s?=
(...)
Message-ID: <21944831.01314352473121.JavaMail.HAC001ES@SE115179>
Subject: =?UTF-8?Q?How_to_include_=C2=A3_pound_symbol?=
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
lalala
В любом случае вы всегда можете использовать:
String yourEncodedString = MimeUtility.encodeText(str, "UTF-8", "Q");
mimeMessage.setHeader("Subject", yourEncodedString);