Мое приложение должно отправить текстовый файл, который сначала должен быть сгенерирован как строка.Текст содержит не-ASCII символы, поэтому я хотел бы, чтобы это был UTF-8.Я перепробовал много вариантов, но все, что я получаю в качестве приложения, это несколько вопросительных знаков.И когда я отправляю тот же текст, что и тело сообщения, все работает нормально.
Вот строка кода, которая генерирует MimeBodyPart с вложением:
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--
Я просто не понимаю, почему кодировки отличаются от того, что я пытаюсь установить, и откуда они берутся.