开发环境
名称 | 版本 |
---|---|
操作系统 | Windows 10 X64 |
JDK | JDK1.8(jdk-8u151-windows-x64) |
IntelliJ IDEA | IntelliJ IDEA 2018.3 |
Maven | Maven 3.6.0 |
参考
标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529
附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html
问题描述
开发了一个发送邮件的功能,读取对应数据和文件作为邮件发送给用户,出现了下面的问题。
邮件标题:中文内容显示为 ?
。
邮件内容:中文内容显示为 ?
。
邮件附件:中文名称不显示。
原因分析
未修改前代码如下
//Instantiate an HttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
//set http header
addAuthHeader(httpPost);
//set http body
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式
builder.setBoundary(boundary);
builder.addTextBody("To",to);
builder.addTextBody("CC",cc);
builder.addTextBody("Bcc",bcc);
builder.addTextBody("EmailType",param.getEmailType().toString());
if(StringUtil.isBlank(param.getFrom())) builder.addTextBody("From",from);
else builder.addTextBody("From",param.getFrom());
//解决标题,内容中的中文乱码问题
builder.addTextBody("Title",param.getTitle());
builder.addTextBody("Content",param.getContent());
builder.addTextBody("Priority",param.getPeriority().toString());
builder.addTextBody("BodyFormat",param.getBodyFormat().toString());
if(CollectionUtils.isNotEmpty(param.getAttachment())){
for(MailAttaData itemAtta : param.getAttachment()){
builder.addBinaryBody(
"file",
itemAtta.getStream(),
ContentType.APPLICATION_OCTET_STREAM,
itemAtta.getFileName()
);
}
}
问题解决
解决附件名称中出现中文名不显示的问题
//附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html
//解决上传文件中的中文乱码问题
//BROWSER_COMPATIBLE自定义charset,RFC6532=utf-8,STRICT=iso-8859-1
//此处一定要用RFC6532,网上普遍用的BROWSER_COMPATIBLE依然会出现中文名乱码
builder.setMode(HttpMultipartMode.RFC6532);
//builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式,这里的设置是无效的,依旧乱码
解决标题和内容中文显示为 ? 的问题
//标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529
//解决标题,内容中的中文乱码问题
//builder.addTextBody("Title",param.getTitle());
//builder.addTextBody("Content",param.getContent());
ContentType contentType= ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
builder.addPart("Title",new StringBody(param.getTitle(),contentType));
builder.addPart("Content",new StringBody(param.getContent(),contentType));
修改后的完整代码
//Instantiate an HttpClient
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
//set http header
addAuthHeader(httpPost);
//set http body
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html
//解决上传文件中的中文乱码问题
//BROWSER_COMPATIBLE自定义charset,RFC6532=utf-8,STRICT=iso-8859-1
//此处一定要用RFC6532,网上普遍用的BROWSER_COMPATIBLE依然会出现中文名乱码
builder.setMode(HttpMultipartMode.RFC6532);
//builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式,这里的设置是无效的,依旧乱码
builder.setBoundary(boundary);
builder.addTextBody("To",to);
builder.addTextBody("CC",cc);
builder.addTextBody("Bcc",bcc);
builder.addTextBody("EmailType",param.getEmailType().toString());
if(StringUtil.isBlank(param.getFrom())) builder.addTextBody("From",from);
else builder.addTextBody("From",param.getFrom());
//标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529
//解决标题,内容中的中文乱码问题
//builder.addTextBody("Title",param.getTitle());
//builder.addTextBody("Content",param.getContent());
ContentType contentType= ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
builder.addPart("Title",new StringBody(param.getTitle(),contentType));
builder.addPart("Content",new StringBody(param.getContent(),contentType));
builder.addTextBody("Priority",param.getPeriority().toString());
builder.addTextBody("BodyFormat",param.getBodyFormat().toString());
if(CollectionUtils.isNotEmpty(param.getAttachment())){
for(MailAttaData itemAtta : param.getAttachment()){
builder.addBinaryBody(
"file",
itemAtta.getStream(),
ContentType.APPLICATION_OCTET_STREAM,
itemAtta.getFileName()
);
}
}