【问题标题】:Spring MimeMessageHelper attachment filename encodingSpring MimeMessageHelper 附件文件名编码
【发布时间】:2017-12-25 01:48:32
【问题描述】:

我在我的 Spring Boot 应用程序中使用MimeMessageHelper 发送邮件。

如何告诉它对包含字母 à 的文件名进行编码,以便正确显示?

在构造MimeMessageHelper 时将编码设置为UTF-8 似乎没有帮助。在 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

【问题讨论】:

    标签: java spring email encoding


    【解决方案1】:

    我在下载西里尔文文件名时遇到了类似的问题。解决方案是对文件名进行编码(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();
        }
    

    并以这种方式使用它:

    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 );
            }
    

    我在这里找到了这个解决方案:http://outofrange.ru/2016/11/encode-non-ascii-filename-content-disposition/

    【讨论】:

      【解决方案2】:

      我已经用这些行解决了这个问题:

      • 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
      );
      

      【讨论】:

        【解决方案3】:

        日文文件名有同样的问题,以下步骤修复了它,

        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,  MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, "UTF-8");
        //IMP steps
        System.setProperty("mail.mime.splitlongparameters", "false");
        attachedFileName = MimeUtility.encodeText(attachedFileName, "UTF-8", "Q");
        //
        helper.addAttachment(attachedFileName, attachmentFile);
        
        

        没有 Q 选项的 Mimeutility.encodetext 不起作用,如果没有设置 system.setproperty,它也不起作用。 这告诉 mimeutility 将字符串编码为带引号的可打印 - 在这里找到一些东西 - https://stackoverflow.com/a/21575089

        【讨论】:

          【解决方案4】:

          在 MimeMessageHelper 实例化之前添加这一行:

          System.setProperty("mail.mime.splitlongparameters", "false");
          

          【讨论】:

            猜你喜欢
            • 2017-05-05
            • 1970-01-01
            • 1970-01-01
            • 2016-06-10
            • 2021-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多