Вопросительные знаки в электронной почте для символов, таких как неразрывный пробел.Это происходит только в Unix, а не в Windows - PullRequest
1 голос
/ 12 ноября 2011

У меня странная проблема, связанная с типом контента / кодировкой. Вот мой фрагмент кода Java ниже. Этот код прекрасно работает на компьютере с Windows, где сервер приложений работает под управлением Windows, а сервер SMTP для отправки электронных писем также является Windows localhost. Когда я развертываю тот же код на сервере Unix, электронное письмо, отправленное для того же содержимого, содержит вопросительные знаки (???) для специальных символов, таких как неразрывный пробел.

Я много гуглил, но не нашел решения. Как я могу решить эту проблему? Я пытался использовать следующие типы контента: ISO-8859-1 , UTF-8 и Windows-1252 . Ничего не помогает.

        MimeMessage message = new MimeMessage(session);
                .............

        Multipart mp = new MimeMultipart();
        MimeBodyPart messageBody = new MimeBodyPart();
        messageBody.setContent(mailMessage, "text/html;charset=Windows-1252");
        messageBody.setHeader("Content-Type", "text/html;charset=Windows-1252");

        // Add body to the multimedia part
        mp.addBodyPart(messageBody);
        message.setContent(mp);

        // Send message
        Transport.send(message);

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

В конце концов, мне пришлось пойти грубым путем.Я заменил такие символы пробелом.

mailMessage.replaceAll("[^\\x20-\\x7e]", " ");

Теперь все специальные символы, такие как неразрывный пробел или любой другой символ, выходящий за пределы обычного диапазона, будут заменены пробелом.В этом случае электронная почта в любом случае была предназначена для обычного текста.

2 голосов
/ 12 ноября 2011

Вы используете один и тот же почтовый сервер в обоих случаях?И та же самая клиентская программа для просмотра сообщения?

Для отладки непосредственно перед вызовом Transport.send добавьте:

message.writeTo(new FileOutputStream("msg.txt"));

и затем проверьте файл msg.txt, чтобы увидетьсимволы правильно закодированы.

Как создать текст в строке mailMessage?Если вы не создадите строку с правильными символами Unicode, никакая кодировка не сделает это правильно.

Кроме того, вам никогда не нужно явно устанавливать заголовок Content-Type, удалите эту строку.

И вместо setContent используйте:

messageBody.setText(mailMessage, "html", "utf-8");

Это гарантирует, что заголовок Content-Type установлен правильно и параметры (например, charset) указаны правильно.

...