Задать вопрос
@geolaz

Как исправить кодировку в имени вложения Zimbra?

Приветствую всех.
Суть проблемы:
Мы работаем с почтовым сервером Zimbra 8.6.0, контрагенты перешли на Exchange 2013 и теперь при отправке писем от них к нам, в именах вложенных файлов кириллические символы превращаются в URL-кодировку и в конце добавляется кавычка. Подскажите хотя бы куда копать, у меня вообще никаких идей...
b61dcbccd816465ebe34445907645eee.png
  • Вопрос задан
  • 1083 просмотра
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@mihej
Господа, буду третьим у меня такой же вопрос.
Ответ написан
Комментировать
@Sejoja
Исправил таким образом на версии zcs-10.1.6
Если собираете zimbra с git репозитория, то измените DEFAULT_CHARSET в файлах ZMimeParser.java и MimeHeader.java в модуле zm-mailbox с CharsetUtil.ISO_8859_1 на CharsetUtil.UTF_8 это решит проблему с битыми вложениями.

private static final Charset DEFAULT_CHARSET = CharsetUtil.normalizeCharset(CharsetUtil.UTF_8); // ZMimeParser
static final Charset DEFAULT_CHARSET = CharsetUtil.normalizeCharset(CharsetUtil.UTF_8); //MimeHeader


Так же можете исправить неверное соединение имени файлов (лишние двойные ковычки и закрывающая двойная ковычка)685564feea51f361462860.png благодаря этому коду в файле Mime.java в методе getFilename:
public static String getFilename(MimePart mp) {
        String name = null;

        // first, check the Content-Disposition header for the "filename" parameter
        try {
            String cdisp = mp.getHeader("Content-Disposition", null);
            if (cdisp != null) {
                // will also catch (legal, but uncommon) RFC 2231 encoded filenames
                //   (things like filename*=UTF-8''%E3%82%BD%E3%83%AB%E3%83%86%E3%82%A3.rtf)
                name = new ContentDisposition(cdisp).getParameter("filename");

                // Регулярное выражения для выделения на части собранного названия документа
                Pattern DELETE_BRACKETS_FROM_SPLIT = Pattern.compile("(.+?)(\\\"\\\")");
                // Регулярнрое выражение для нахождения лишней КОВЫЧКИ с конца
                Pattern DELETE_BRACKETS_FROM_END = Pattern.compile("(\")$");

                if(DELETE_BRACKETS_FROM_SPLIT.matcher(name).find() & DELETE_BRACKETS_FROM_END.matcher(name).find()){
                    // НАходим группы с помощью регулярки и оставляем группы по индексу $1
                    name = DELETE_BRACKETS_FROM_SPLIT.matcher(name).replaceAll("$1");

                    // Заменяем найденные группы на пустоту
                    name = DELETE_BRACKETS_FROM_END.matcher(name).replaceAll("").trim();
                }
            }
        } catch (MessagingException me) {
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы