Utf 8 charset не работает с javax mail

Я использовал Javax Mail API для отправки писем. Я использую формуляр контакта для отправки ввода, который должен быть отправлен на конкретное электронное письмо.

Письмо отправляется без проблем, хотя я датский парень, поэтому мне нужны три датских персонажа, которые являются "æ", "ø" и "å", в теме и тексте электронной почты.

Поэтому я видел, что я могу использовать кодировку символов UTF-8, чтобы предоставить эти символы, но когда моя почта отправляется, я вижу только странные буквы - "ã|", "ã¸" и "ã ¥" - вместо датских букв - "æ", "ø" и "å".

Мой метод отправки электронной почты выглядит следующим образом

public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
    //Set Mail properties
    Properties props = System.getProperties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "465");
    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("my_username", "my_password");
        }
    });

    //Create the email with variable input
    MimeMessage mimeMessage = new MimeMessage(session);
    mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
    mimeMessage.setFrom(new InternetAddress(fromEmail, name));
    mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
    mimeMessage.setSubject(subject, "utf-8");
    mimeMessage.setContent(message, "text/plain");

    //Send the email
    Transport.send(mimeMessage);
}

Пожалуйста, помогите мне узнать, как я могу исправить эту "ошибку".

Ответ 1

Для всех сообщений электронной почты

Есть пара системных свойств, связанных с рассылкой, которые могут, вероятно, упростить ваш код. Я говорю об этом конкретном свойстве: "mail.mime.charset".

Системное свойство mail.mime.charset можно использовать , чтобы указать кодировку MIME по умолчанию, чтобы использовать для кодированных слов и текстовых частей, которые иначе не указывают кодировку. Обычно кодировка MIME по умолчанию выводится из кодировки Java по умолчанию, как указано в свойстве file.encoding System. В большинстве приложений не требуется явно устанавливать кодировку MIME по умолчанию. В случаях, когда кодировка MIME по умолчанию, используемая для почтовых сообщений, отличается от кодировки, используемой для файлов, хранящихся в системе, это свойство должно быть установлено.

Как вы можете прочитать выше, по умолчанию нет значения для mail.mime.charset и используется кодировка файла (file.encoding).

Для конкретного электронного письма

Однако, если вы хотите указать конкретную кодировку для определенного сообщения электронной почты, то вам, вероятно, следует использовать методы 2 setSubject(subject,charset) и setText(text,charset).

Если это не работает, возможно, ваш вход уже поврежден, прежде чем он достигнет этой точки. Другими словами, вы, вероятно, использовали неправильную кодировку для сбора ваших данных.

Мимические типы сложны

setContent(content, "UTF-8") (как утверждают другие источники) просто не сработает. Посмотрите на подпись этого метода: setContent(Object content, String mimetype). Mime type и charset - это две совершенно разные вещи. Imho, вы действительно должны использовать один из методов setText(...) с параметром charset.

Но если вы продолжаете использовать mimetype для установки charset setContent(content,mimetype), используйте правильный формат. (а не только "UTF-8", но что-то вроде "text/plain; charset=UTF-8"). Но что более важно, знать, что каждый тип mime имеет свой собственный способ обработки кодировок.

  • Как указано в RFC-2046, набор символов по умолчанию для text/plain равен US-ASCII, но может быть отменен с дополнительным параметром charset.
  • Однако в RFC-6657 ясно, что тип text/xml определяет кодировку с использованием содержимого сообщения. Параметр charset будет просто проигнорирован здесь.
  • В RFC-2854 указано, что text/html должен всегда указывать кодировку. Но если вы этого не сделаете, то он будет использовать ISO-8859-1 (= Latin-1).

Ответ 3

Потратив много времени на отладку и поиск в Интернете, я нашел решение своей проблемы.

Кажется, что всякий раз, когда я отправлял данные через веб-запрос, мое приложение не кодировало символы с кодировкой UTF-8. Это означало, что данные, которые были отправлены из моей контактной формы, которая содержала символы æ, ø и å, не могли быть обработаны с помощью кодировки символов.

В моем дескрипторе развертывания, как представляется, было установлено Фильтр кодировки символов, который будет кодировать весь входящий запрос из Интернета с кодировкой символов UTF-8.

private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

Этот фильтр устанавливает кодировку UTF-8 и принудительно кодирует все запросы, начинающиеся с URL '/*'.

Ответ 4

Это легко, запустите ваш проект с параметром -Dfile.encoding = UTF-8 например: Java -Dfile.encoding = UTF-8 -jar MyProject.jar

//Исправить опечатку

Ответ 5

для меня было достаточно установить tomcat web.inf(/tomcat/8.0.33/conf/web.inf), в частности заголовок.

вместо:

<?xml version="1.0" encoding="ISO-8859-1"?>

Я использую сейчас:

<?xml version="1.0" encoding="UTF-8"?>