Java Mail API-проблемы кодирования
я использую JAVA Mail API, и я пытаюсь отправить электронное письмо через SMTP Gmail. Как работает моя программа: Ява.утиль.Класс сканера используется для получения пользовательского ввода - я прошу пользователя использовать различные параметры в классе отправки почты; который делает следующее:
Message mailMessage = new MimeMessage(session);
mailMessage.setFrom(new InternetAddress("example@example.com"));
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo()));
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
Transport.send(mailMessage);
все работает, пока я использую символы ASCII / символы. Но когда я хочу использовать "страновых" персонажи - как [õäöü] - я получаю кучу странных символов...
методы, которые я использовал до сих пор (которые не работают для меня):
setHeader("Content-Type", "text/plain; charset=UTF-8");
setHeader("Content-Encoding","ISO-8859-9");
setContent(message, "text/plain; charset=iso-8859-2");
Примечание: все отображается правильно внутри IDE, когда система.из.println () выполняется для отображения отправляемого сообщения.
EDIT: e.X. когда тело отправленного сообщения [õäöü] Он отображается [ä""?] в Gmail.
EDIT: когда mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));
используется, затем вывод в Gmail следующий:
"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?="
другое редактирование: интересно, когда я делаю:mailMessage.setText(strVar + "õäöü", "ISO-8859-1");
Он на самом деле добавляет "õäöü" красиво в мою электронную почту (но первая часть [strVar] строки все еще полна ?и []'ы).
7 ответов
MimeMessage message = new MimeMessage(session);
message.setSubject(subject, "UTF-8");
message.setText(body, "UTF-8");
таким образом, нужно установить кодировку символов для обоих, тела и субъекта.
добавление из-за комментария @bartac
соответствующего MimeBodyPart
сделать setHeader("Content-Type", "text/plain; charset=UTF-8")
.
вы должны использовать setText(String text, String charset)
или setText(String text, String charset, String subtype)
установить текст в определенной кодировке.
MimeUtility.encodeText()
не предназначен для текстового текста, а только для закодированного текста в заголовках (а затем только для заголовков, установленных с setHeader
или addHeader
).
в принципе, мой код работает просто отлично, как и предполагалось. Это был cmd, который не мог обрабатывать буквы, отличные от ascii. Я использовал файл bat для доступа к банку. Я думаю, я просто собираюсь сделать немного GUI тогда... Спасибо всем, что ответили.
для меня сработало следующее:
MimeMessage message = ...
message.setSubject(subject, "UTF-8");
message.setContent(body, "text/plain; charset=UTF-8");
здесь subject
и body
являются регулярными строковыми объектами без специального обращения (код и пользовательский интерфейс используют UTF-8).
1 - считайте, вы хотите отправить электронное письмо с этой строкой в теле:
"Olá João!"
2-поскольку код выполняется на сервере GAE, эта строка интерпретируется с кодировкой ASCII по умолчанию. Чтобы отправить это письмо с правильными знаками ударения, определите строку как:
String body = "Ol\u00e1 Jo\u00e3o!";
специальные символы определяются вручную с помощью кодов UTF-8. Поиск кодов вам необходимо в таблице http://www.utf8-chartable.de/
3 - конвертируйте кодировка строки в UTF-8. Все коды, введенные вручную, теперь будут правильно интерпретированы:
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
String encodedSubject = new String (subject.getBytes("UTF-8"),"UTF-8");
String encodedBody = new String (body.getBytes("UTF-8"),"UTF-8");
message.setSubject(encodedSubject, "UTF-8");
message.setText(encodedBody, "UTF-8");
используйте метод encodeText из MimeUtility:
MimeUtility.encodeText(mail_subject, "UTF-8", "B")
(Я не знаю, что означает" B", сохраняйте спокойствие и просто используйте. На самом деле это может быть "B" или "Q".)
JavaMailSenderImpl emailSender = new JavaMailSenderImpl();
mailSender.setHost("...");
MimeMessage message = emailSender.createMimeMessage();
message.setSubject("...", "UTF-8");
message.setText("...", "UTF-8");
MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8");
helper.setFrom(from);
helper.setTo(to);
emailSender.send(message);