Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a test for an email with UTF-8 subject #484

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,52 @@ public void messagesAdded(MessageCountEvent e) {
}
}

@Test(timeout = 10000)
public void testTextPlainWithUTF8SubjectAndGreenMailApi() throws MessagingException, IOException {
greenMail.setUser("to@localhost", "pwd");
final IMAPStore store = greenMail.getImap().createStore();
store.connect("to@localhost", "pwd");
try {
String subject = "кирилица ünicöde_\uD83C\uDF36";
Folder inboxFolder = store.getFolder("INBOX");
inboxFolder.open(Folder.READ_ONLY);
Message[] messages = new Message[] { null };
MessageCountListener listener = new MessageCountListener() {
@Override
public void messagesRemoved(MessageCountEvent e) {
}

@Override
public void messagesAdded(MessageCountEvent e) {
messages[0] = e.getMessages()[0];
}
};
inboxFolder.addMessageCountListener(listener);
new Thread(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
// Ignore
}
try {
MimeMessage message = GreenMailUtil.createTextEmail(
"to@localhost", "from@localhost", "will be replaced", "body", greenMail.getSmtp().getServerSetup());
message.setHeader("Subject", subject);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All headers must be encoded, see https://www.rfc-editor.org/rfc/rfc2047 for details.

Could be done e.g. via

message.setHeader("Subject", MimeUtility.encodeText(subject));

or indirectly by using

message.setSubject(...)

Longer subjects (encoded >76 chars) need to be folded, too. Example from https://github.com/jakartaee/mail-api/blob/master/api/src/main/java/jakarta/mail/internet/MimeMessage.java#L874 :

		setHeader("Subject", MimeUtility.fold(9,
		    MimeUtility.encodeText(subject, charset, null)));

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@marcelmay thanks for the response. I obviously haven't read the RFC, however isn't the mail.mime.allowutf8 property exactly for that? Doesn't it allow setting UTF-8 symbols in headers without encoding first? That requires server support as far as I understand but otherwise it's supposed to work. Or did I misunderstand something? If I'm correct, then this test should work (after mail.mime.allowutf8 is somehow set - which I haven't done - please see my initial comment).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After diving into JavaMail sources this will only work if the SMTP server also announces SMTPUTF8, which GreenMail currently does not support:

https://github.com/javaee/javamail/blob/master/mail/src/main/java/com/sun/mail/smtp/SMTPTransport.java#L768 :

	    if (allowutf8 && !supportsExtension("SMTPUTF8"))
		logger.log(Level.INFO, "mail.mime.allowutf8 set " +
			    "but server doesn't advertise SMTPUTF8 support");

It is really mail server dependent. If I force the property, it shows up in the logs:

Feb 06, 2023 9:55:41 PM com.sun.mail.smtp.SMTPTransport protocolConnect
INFO: mail.mime.allowutf8 set but server doesn't advertise SMTPUTF8 support

I created #535 for SMTPUTF8. Though I believe not many servers support it ... ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No idea how many servers support it. And yes, I guess GreenMail also doesn't support that. But in any case, this is rather low-priority I would think. #481 and #483 are much more important.

GreenMailUtil.sendMimeMessage(message);
} catch (MessagingException ex) {
assertThat(false).isTrue();
}
}).start();
((IMAPFolder) inboxFolder).idle(true);

assertThat(messages[0].getSubject()).isEqualTo(subject);

inboxFolder.close();
} finally {
store.close();
}
}

private void sendMessage(InternetAddress fromAddress, InternetAddress toAddress) throws MessagingException {
final Session session = greenMail.getSmtp().createSession();
MimeMessage message = new MimeMessage(session);
Expand Down