ygl*_*odt 3 java email encoding spring
我MimeMessageHelper在 Spring Boot 应用程序中发送邮件。
我如何告诉它对包含字母的文件名进行编码à,以便正确显示?
UTF-8在构造时将编码设置为MimeMessageHelper似乎没有帮助。在 Gmail 中,生成的附件显示为
=?UTF-8?Q?ex-comp_s.=C3=A0_r.l.?= =?UTF-8?Q?-201\"; filename*1=\"7-07-12_=E2=80=95_2017-07-18
Run Code Online (Sandbox Code Playgroud)
我已经解决了这些行的问题:
System.setProperty("mail.mime.splitlongparameters", "false")MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8")MimeUtility.encodeWord(attachmentFilename)这是示例代码,
System.setProperty("mail.mime.splitlongparameters", "false");
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
// Your email content
helper.setFrom("...");
helper.setTo("...");
helper.setSubject("...");
helper.setText("...");
helper.addAttachment(
MimeUtility.encodeWord(attachmentFilename),
attachmentContent
);
Run Code Online (Sandbox Code Playgroud)
小智 0
我在下载西里尔文文件名时遇到了类似的问题。解决方案是对文件名进行编码(rfc5987):
public static String rfc5987_encode(final String s) throws UnsupportedEncodingException {
final byte[] s_bytes = s.getBytes("UTF-8");
final int len = s_bytes.length;
final StringBuilder sb = new StringBuilder(len << 1);
final char[] digits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
final byte[] attr_char = {'!','#','$','&','+','-','.','0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','^','_','`', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','|', '~'};
for (int i = 0; i < len; ++i) {
final byte b = s_bytes[i];
if (Arrays.binarySearch(attr_char, b) >= 0)
sb.append((char) b);
else {
sb.append('%');
sb.append(digits[0x0f & (b >>> 4)]);
sb.append(digits[b & 0x0f]);
}
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
并这样使用它:
private static final String CONTENT_DISP_PREFIX = "attachment; filename=";
private static final String CONTENT_DISP_EXTRA_PREFIX = "attachment; filename*=UTF-8''";
private static final String USER_AGENT_FIREFOX = "Firefox";
...
if (!ua.contains(USER_AGENT_FIREFOX)) {
response.setHeader(CONTENT_DISP_HEADER, CONTENT_DISP_PREFIX + "\"" + encodedFileName + "\"");
} else {
response.setHeader(CONTENT_DISP_HEADER, CONTENT_DISP_EXTRA_PREFIX + encodedFileName );
}
Run Code Online (Sandbox Code Playgroud)
我在这里找到了这个解决方案:http://outofrange.ru/2016/11/encode-non-ascii-filename-content-disposition/
| 归档时间: |
|
| 查看次数: |
3983 次 |
| 最近记录: |