【JAVA】javaMail附件名超过60显示错误

javaMail是我们java开发中常用的发邮件方式,但是会有某些

现象

附件名称无法正常展示,出现如:untitled,bat等不正确文件名。

分析

if (value.length() > 60 &&
				splitLongParameters && encodeParameters) {
		    int seg = 0;
		    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));
		}
	    }
        }

类的位置:javax.mail.internet.ParameterList#toString(int)

编码后的文件名长度超过60之后,并且splitLongParameters=true,encodeParameters=true的情况下或进行切断,导致文件名异常。

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

在没有设置mail.mime.splitlongparameters相应值的情况下,默认值为true,并且一经初始化不可再被修改,导致后续即使指定该值为false依然无效,最终文件名超长被截断。

解决方案

在项目启动是添加参数初始化该值

//解决附件名不能过长的问题
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
SpringApplication.run(AccountApplication.class, args);

这样写的原因:

  1. 保证在项目启动之后,该参数就被指定,避免启动之后某些操作提前初始化splitLongParameters=true。
posted @ 2021-02-03 11:16  牛蜗  阅读(1275)  评论(0编辑  收藏  举报