• SpringBoot开发案例之mail中文附件乱码


    前一段时间做过一个邮件发送的服务,以前大体都测试过,文本、图片、附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示:

    咋一看不像乱码,抱着试试看的态度,为MimeMessageHelper硬性加了编码:

    helper.addAttachment(MimeUtility.encodeText(fileName), file);
    

    并且对文件名称加了转码:

    MimeUtility.encodeText(attachmentFilename)
    

    但是,如果你跟进源码会发现spring已经为你做了转码工作,所以这个问题不存在的。

    继续跟进MimeBodyPart类,发现setFileName方法中有个ParameterList类,点击继续跟进ParameterList类,里面的toString方法:

    if ((value.length() > 60) && (splitLongParameters)
    						&& (encodeParameters)) {
    					int seg = 0;
    					name = name + "*";
    					while (value.length() > 60) {
    						sb.addNV(name + seg, quote(value.substring(0, 60)));
    						value = value.substring(60);
    						++seg;
    					}
    					if (value.length() > 0)
    						sb.addNV(name + seg, quote(value));
    				} else {
    					sb.addNV(name, quote(value));
    				}
    

    上面这段代码的逻辑,大家应该可以很清晰的理解了吧,大家可以发现如果value.length() > 60 并且 splitLongParameters?哎,问题来了,splitLongParameters到底是个什么值,我们查找splitLongParameters,发现了其在类开头已经定义了

    private static final boolean splitLongParameters = PropUtil
    			.getBooleanSystemProperty("mail.mime.splitlongparameters", true);
    

    大致意思就是,编码后的文件名长度如果大于60并且splitLongParameters的值为true,encodeParameters的值为true,文件名就会被截取,想想编码后的值被截取是什么样子?也只能是文章开头截图的显示了。

    最终的解决方案就是,在发送的时候初始化splitLongParameters为false不截取:

    static {
    		 System.setProperty("mail.mime.splitlongparameters","false");
    	}
    
  • 相关阅读:
    asp.net c#中去掉最后一个字符和去掉第一个字母
    两个div并排
    VS.Net2005中使用本地化功能实现多语言的切换
    gridview嵌套DropDownList選定值[转]
    C# 获取系统时间
    NERDTree,好用的文件浏览器
    通过$.browser来判断浏览器
    vim 智能提示
    让vim显示函数列表
    vim中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/smallSevens/p/7599925.html
Copyright © 2020-2023  润新知