JavaMail中的国际化(一)

原创 2016年08月30日 22:41:44

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会根据具体情况来选择相应的编码方式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JavaMail中的国际化(二)

书接前文,在解决了附件名乱码问题后,本文我们将目光转移到mail body上。   首先还是请大家先看一个bug,业务背景是这样的——当满足某种条件时,软件自动发功向用户发送alert邮件。本例中...

Qt国际化(源码含中文时)的点滴分析

公告:CSDN博客积分系统正式上线!Qt国际化(源码含中文时)的点滴分析 分类: Qt C/C++ 2011-04-19 23:55 523人阅读 评论(2) 收藏 举报 注意:本文不介绍如何使用Qt...

C++国际化(各种乱码的解决方案之一)

C++之国际化(1)     国际化(Internationalization,简写为i18n)     国际化的主要思路是以locale(地域、本土、国别)对象来代表一个可扩展的面貌...

Anguarjs实现国际化,中英文切换Demo

目录结构 index.html Test Page ...

应用国际化(i18n)

一、国际化开发概述   软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。   国际化(internati...

Yii i18n国际化,消息翻译

实现国际化有两种方式,基于文件实现和基于数据库实现。基于文件实现的方式很简单,网上有很多,请自行查询使用。这里主要说一下基于数据库实现的方式。前提 待翻译的消息使用Yii::t()方法显示,方法参数...

Struts(14)本地化/国际化(i18n)

国际化(i18n)是规划和实施的产品和服务,使他们能很容易地适应特定的本地语言和文化的过程中,这个过程被称为本地化。国际化的过程有时也被称为翻译或本地化启用。国际化是缩写i18n,因为我和两端用n字打...

struts2实现国际化,多语言切换

Struts2实现国际化,多语言切换根据struts2中的i18n 实现多语言切换、项目截图先写basename_en_US.properties文件和basename_zh_CN.propertie...

iOS语言国际化(切换语言)

基本设置 第一步:先在Project的info里添加所需要支持的语言,这里选择的是Chinese(Simplified)和English-Development Language。 第二步:创建Loc...

iOS -- 应用程序国际化(多语言)

一、程序国际化 1、首先我们创建一个工程,命名为InternationDemo,然后添加多语言。 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串存在于Main.storyboar...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)