开发环境
| 名称 | 版本 |
|---|---|
| 操作系统 | 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 HttpClientCloseableHttpClient httpclient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);//set http headeraddAuthHeader(httpPost);//set http bodyMultipartEntityBuilder 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 HttpClientCloseableHttpClient httpclient = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);//set http headeraddAuthHeader(httpPost);//set http bodyMultipartEntityBuilder 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());}}
测试结果
