书接前文,在解决了附件名乱码问题后,本文我们将目光转移到mail body上。
首先还是请大家先看一个bug,业务背景是这样的——当满足某种条件时,软件自动发功向用户发送alert邮件。本例中的期望结果应该是向日文用户发送以下信息。
而用户看到的实际结果如下图。
与上次不同,这回我们需要查阅的是发送不带附件邮件的代码,示意如下。
protected void sendEmailConfig(Email email, String from, String csvTo, String subject, String messageText) throws MessagingException, EmailException {
email.setHostName(config.getServer());
email.setSmtpPort(config.getPort());
...
email.setFrom(from);
email.setTo(Arrays.asList(InternetAddress.parse(csvTo, false)));
email.setSubject(subject);
if (email instanceof HtmlEmail) {
messageText = "<html><body>" + messageText.replace("\n", "<br />") + "</body></html>";
((HtmlEmail)email).setHtmlMsg(messageText);
} else {
email.setMsg(messageText);
}
...
}
既然是body的编码问题,那么首先想到就是html mail没有添加head,同时需要指明charset。除此之外,还需要统一再次明示mail的编码方式,添加setCharset方法。
messageText = "<html><head><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"></head><body>" + messageText.replace("\n", "<br />") + "</body></html>";
email.setCharset(emailEncoding);
protected void sendEmailConfig(Email email, String from, String csvTo, String subject, String messageText) throws MessagingException, EmailException {
email.setHostName(config.getServer());
email.setSmtpPort(config.getPort());
...
email.setCharset("UTF-8");
email.setFrom(from);
email.setTo(Arrays.asList(InternetAddress.parse(csvTo, false)));
email.setSubject(subject);
if (email instanceof HtmlEmail) {
messageText = "<html><head><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\"></head><body>" + messageText.replace("\n", "<br />") + "</body></html>";
((HtmlEmail)email).setHtmlMsg(messageText);
} else {
email.setMsg(messageText);
}
...
}
再次发送mail,乱码问题不再出现。
至此,我们已经覆盖了带附件的mail和不带附件的mail,无论他们是HtmlEmail还是MultiPartEmail,解决问题之道也许各异,但如果站在国际化测试人员的角度审视,不难发现最大的共通点即Charset。也就是说,无论其业务背景如何复杂,只要技术层面上使用Java Mail,同时并未调用setCharset方法,那么所有邮件相关的测试用例都不必再执行,直接报bug即可。