JavaMail中的国际化(二)

本文关注JavaMail中邮件正文(body)的国际化问题。在遇到日文用户接收邮件时显示乱码的情况,通过检查发送不带附件邮件的代码,发现是body的编码问题。解决方法包括在HTML邮件中添加charset属性,并使用setCharset方法明确指定邮件编码为UTF-8。此方案适用于HtmlEmail和MultiPartEmail,避免了邮件乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书接前文,在解决了附件名乱码问题后,本文我们将目光转移到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即可。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值