JavaMail中的国际化(一)

JavaMail在处理邮件时,尤其是附件名含有中文时可能会出现乱码问题。通过分析,发现需对附件名使用MimeUtility.encodeText进行编码。MimeUtility工具类根据RFC2047规范进行MIME头的编码和解码,通常JavaMail会自动处理邮件头的ASCII兼容性,但在使用setHeader等方法时需手动编码。理解RFC822对于邮件头的ASCII限制和编码方式对于正确发送非英文邮件至关重要。

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

JavaMail是JavaEE中13种核心技术之一,其中有不少涉及国际化的知识点,例如subject, body, attachment时间日期等。本文我们来关注邮件附件乱码问题,首先看一个真实的bug,测试步骤如下。

1. 创建一个mail notification,附件名为中文

2. 触发notification条件,发送mail并检查


结果如图所示。

一探究竟,最终我们在notification代码中找到了addAttachment方法。

public void addAttachment(NotificationAttachment attachment) {
   Assert.notNull(attachment, "Attachment was null");
   try {
	   String fileName = attachment.getFileName();
	   if (StringUtil.isNullOrEmpty(fileName)) {
fileName = DEFAULT_FILE_NAME + multipart.getCount();
	   }
	}	
	...
}

读到这里,其实我们已经破解了该问题,只要调用MimeUtility.encodeText方法对fileName进行编码即可,修改如下。

public void addAttachment(NotificationAttachment attachment) {
   Assert.notNull(attachment, "Attachment was null");
   try {
	   String fileName = attachment.getFileName();
	   if (StringUtil.isNullOrEmpty(fileName)) {
fileName = DEFAULT_FILE_NAME + multipart.getCount();
		}
		fileName = MimeUtility.encodeText(fileName);
	}	
	...
}

问题解决!不过关于MimeUtility工具类,这里仍需多说几句。该类包含一组根据RFC2047规范来对MIME头进行编码和解码的方法。但一般情况下,使用setSubject和setRecipients方法时候,编解码方法是无需使用的,JavaMail会自动进行编码和解码。这些方法只有在使用setHeader及getHeader方法操作MIME头时才需要被调用。

 

RFC 822规定邮件头只能包含ASCII字符,含有non ASCII字符的邮件头必须进行编码。所以使用Java Mail发送非英文邮件时必须经过编码,否则别人看到的邮件只能是一堆乱码。通常对邮件头的编码方式有两种,一种是base64方式编码,一种是qp(quoted-printable)方式编码,JavaMail会根据具体情况来选择相应的编码方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值