Кодировка utf 8 не работает с почтой javax
Я использовал 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);
}
Пожалуйста, помогите мне узнать, как я могу исправить эту "ошибку".
8 ответов
Для всех электронных писем
Существует несколько системных свойств, связанных с рассылкой, которые могут упростить ваш код. Я говорю об этом конкретном свойстве на самом деле: "mail.mime.charset"
,
mail.mime.charset
Системное свойство можно использовать для указания набора символов MIME по умолчанию, который будет использоваться для закодированных слов и текстовых частей, которые иначе не определяют набор символов. Обычно набор символов MIME по умолчанию выводится из набора символов Java по умолчанию, как указано вfile.encoding
Системное свойство. Большинству приложений не нужно явно устанавливать кодировку MIME по умолчанию. В тех случаях, когда кодировка MIME по умолчанию, используемая для почтовых сообщений, отличается от кодировки, используемой для файлов, хранящихся в системе, это свойство должно быть установлено.
Как вы можете прочитать выше, по умолчанию нет значения для mail.mime.charset
и кодировка файла (file.encoding
свойство) используется.
Для конкретной электронной почты
Однако, если вы хотите указать конкретную кодировку для определенного электронного письма, вам, вероятно, следует использовать параметр 2 setSubject(subject,charset)
а также setText(text,charset)
методы.
Если это не сработает, то, вероятно, ваш ввод уже поврежден до того, как достигнет этой точки. Другими словами, вы, вероятно, использовали неправильную кодировку для сбора ваших данных.
MIME типы сложны
setContent(content, "UTF-8")
(как утверждают другие источники) просто не будет работать. Просто посмотрите на подпись этого метода: setContent(Object content, String mimetype)
, Тип MIME и кодировка - это две совершенно разные вещи. Имхо, вы действительно должны использовать один из setText(...)
методы с параметром charset.
Но если вы продолжаете использовать mimetype для установки кодировки 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
).
Может быть, вы должны предоставить также UTF-8 здесь
mimeMessage.setContent(message, "text/plain; charset=UTF-8");
Вы должны посмотреть на http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utf
Потратив много времени на отладку и поиск в Интернете подсказки, я нашел решение своей проблемы.
Кажется, что когда бы я ни отправлял данные через веб-запрос, мое приложение не кодировало символы в кодировке 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 ' /* '.
Это просто, запустите свой проект с параметром -Dfile.ecoding=UTF-8! например: java -Dfile.encoding=UTF-8 -jar MyProject.jar
mimeMessage.setContent(mail.getBody(), "text/html; charset=UTF-8");
может быть, я ошибаюсь, но это работает для меня. :) любой символ ööö, äää, üüü будет правильно отображаться в моем мировоззрении.
Перед отправкой String методу send вы должны преобразовать String в UTF-8.
Если вы получаете параметр «запрос», вы можете использовать «setCharacterEncoding»:
request.setCharacterEncoding("utf-8");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
...
MimeMessage mineMessage = new MimeMessage(session);
mineMessage.setFrom(new InternetAddress(myAccountEmail));
mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
mineMessage.setSubject(subject, "UTF-8");
mineMessage.setContent(content, "text/plain;charset=UTF-8");
В противном случае преобразуйте строку в формат UTF-8 следующим способом:
String subject = new String(subject.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
String content = new String(content.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
...
MimeMessage mineMessage = new MimeMessage(session);
mineMessage.setFrom(new InternetAddress(myAccountEmail));
mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
mineMessage.setSubject(subject, "UTF-8");
mineMessage.setContent(content, "plain/plain;charset=UTF-8");
Я знаю, что опаздываю с этим вопросом, но у меня только что была похожая проблема.
Возможно, стоит также проверить исходные кодировки! Я использовал тестовый класс с жестко запрограммированной темой / текстом, содержащим некоторые специальные символы, которые постоянно искажались при отправке электронной почты. Хотя я установил кодировку UTF-8 везде, где это возможно (mimeMessage.setSubject (subject, charset), mimeMessage.setContent(content, "text/plain; charset=UTF-8")).
Затем я заметил, что исходная кодировка этого класса была windows-1252. Насколько я понимаю, при компиляции файла java любые исходные тексты преобразуются в UTF-8. Но в этом случае в maven pom.xml для этого проекта отсутствовало свойство project.build.sourceEncoding, поэтому я на самом деле не уверен, какую кодировку maven использовал во время компиляции (по умолчанию), поскольку ничего не было указано.
Изменить исходную кодировку здесь было невозможно, но как только я изменил специальные символы на литералы кода Unicode (например, «ü» на «\ u00fc»), все заработало нормально.
Может быть, слишком поздно, но есть очень простой способ решить эту проблему. Просто вызовите этот конструктор, чтобы создать MimeMessageHelper, который кодирует UTF-8, как мы ожидаем:
MimeMessage **mimeMessage** = mailSender.createMimeMessage();
MimeMessageHelper **helper** = new MimeMessageHelper(mimeMessage, false(or true if you want include Multipart), "UTF-8");
Больше никаких действий не требуется, продолжайте процесс отправки почты по своему усмотрению.