JavaMail отправляет почтовое вложение из строки в кодировке UTF-8

Мое приложение должно отправить текстовый файл, который сначала нужно сгенерировать как строку. Текст содержит символы, отличные от ASCII, поэтому я хотел бы, чтобы это был UTF-8. Я перепробовал множество вариантов, но все, что я получил в качестве приложения, - это вопросительные знаки. И когда я отправляю тот же текст, что и тело сообщения, все работает нормально.

Вот строка кода, которая генерирует MimeBodyPart с вложением:

String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

Я также пробовал использовать строку без каких-либо преобразований, используя только байты, теперь, как вы видите, я пытаюсь сгенерировать строку из байты ...

Что я делаю не так? (И я помню, как делал это в другом проекте, который работает, но у меня больше нет доступа к его исходному коду).

Заранее благодарю. Я перепробовал множество вариантов, но все, что я получил в качестве приложения, - это вопросительные знаки. И когда я отправляю тот же текст, что и тело сообщения, все работает нормально.

Вот строка кода, которая генерирует MimeBodyPart с вложением:

String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

Я также пробовал использовать строку без каких-либо преобразований, используя только байты, теперь, как вы видите, я пытаюсь сгенерировать строку из байты ...

Что я делаю не так? (И я помню, как делал это в другом проекте, который работает, но у меня больше нет доступа к его исходному коду).

Заранее благодарю. Я перепробовал множество вариантов, но все, что я получил в качестве приложения, - это вопросительные знаки. И когда я отправляю тот же текст, что и тело сообщения, все работает нормально.

Вот строка кода, которая генерирует MimeBodyPart с вложением:

String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

Я также пробовал использовать строку без каких-либо преобразований, используя только байты, теперь, как вы видите, я пытаюсь сгенерировать строку из байты ...

Что я делаю не так? (И я помню, как делал это в другом проекте, который работает, но у меня больше нет доступа к его исходному коду).

Заранее благодарю.

String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

Я также пробовал использовать строку без каких-либо преобразований, используя только байты, теперь, как вы видите, я пытаюсь сгенерировать строку из байтов ...

Что я делаю не так? (И я помню, как делал это в другом проекте, который работает, но у меня больше нет доступа к его исходному коду).

Заранее благодарю.

String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

Я также пробовал использовать строку без каких-либо преобразований, используя только байты, теперь, как вы видите, я пытаюсь сгенерировать строку из байтов ...

Что я делаю не так? (И я помню, как делал это в другом проекте, который работает, но у меня больше нет доступа к его исходному коду).

Заранее благодарю. Тимофей.

ОБНОВЛЕНИЕ

Прочитав ваши ответы и после еще нескольких безуспешных экспериментов, я решил, что лучше всего опубликовать код своей рассылки. У меня есть класс Mailer , который выполняет рассылку, а другие классы могут просто вызывать его статический метод sendMessage () для отправки сообщения. И все это работает на Google App Engine.

public static void sendMessage(String to, String subject, String msgBody,
            String attachment) throws AddressException, MessagingException {

    Properties props = new Properties();

    Session mailSession = Session.getDefaultInstance(props, null);
    Message msg = new MimeMessage(mailSession);
    String email = "bla-bla-bla"; // userService.getCurrentUser().getEmail();

    msg.setFrom(new InternetAddress(email));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

    InternetAddress[] addresses = { new InternetAddress("bla-bla-bla") };

    msg.setReplyTo(addresses);
    msg.setSubject(subject);

    Calendar cal = Calendar.getInstance();

    String fileName = cal.get(Calendar.YEAR) + "_"
            + cal.get(Calendar.MONTH) + "_"
            + cal.get(Calendar.DAY_OF_MONTH) + "_"
            + cal.get(Calendar.HOUR_OF_DAY) + "_"
            + cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)
            + "_" + cal.get(Calendar.MILLISECOND) + ".txt";

    // create the message part
    MimeBodyPart messageBodyPart = new MimeBodyPart();

    // fill message
    // Here we should have the msgBody.
    // Sending attachment contents for debugging only.
    messageBodyPart.setText(attachment + " - 4", "UTF-8", "plain");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    MimeBodyPart att = new MimeBodyPart();
    att.setText(attachment, "UTF-8", "plain");
    att.addHeader("Content-Type", "text/plain; charset=UTF-8"); 

    att.setFileName(fileName);
    multipart.addBodyPart(att);

    // Put parts in message
    msg.setContent(multipart);

    Transport.send(msg);
}

И строка, которая вызывает это в другом классе:

Mailer.sendMessage("mymail@example.com", "Test", "No body", "Привет, Я кусок текста");

И необработанный источник почты, как ни странно, (без учета, казалось бы, неактуальных заголовков):

Message-ID: <00163662e7107ccbe3049c1402fb@google.com>
Date: Sat, 12 Feb 2011 11:21:01 +0000
Subject: Pages
From: mymail@example.com
To: mymail@example.com
Content-Type: multipart/mixed; boundary=00163662e7107ccbd4049c1402fa

--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=KOI8-R; format=flowed; delsp=yes
Content-Transfer-Encoding: base64

8NLJ18XULCDxIMvV08/LINTFy9PUwSAtIDQNCg==
--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=US-ASCII; name="2011_1_12_11_21_1_691.txt"
Content-Disposition: attachment; filename="2011_1_12_11_21_1_691.txt"
Content-Transfer-Encoding: base64

Pz8/Pz8/LCA/ID8/Pz8/ID8/Pz8/Pw==
--00163662e7107ccbd4049c1402fa--

] Я просто не понимаю, почему кодировки отличаются от тех, которые я пытаюсь установить, и откуда они взялись.

21
задан PhpXp 2 April 2015 в 15:09
поделиться