Ứng dụng của tôi phải gửi một tệp văn bản mà trước tiên nó phải tạo dưới dạng Chuỗi. Văn bản chứa các ký hiệu không phải ASCII, vì vậy tôi muốn nó là UTF-8. Tôi đã thử rất nhiều biến thể, nhưng tất cả những gì tôi nhận được dưới dạng tệp đính kèm là một số dấu hỏi. Và, khi tôi gửi cùng một văn bản với nội dung thư, nó hoạt động tốt.JavaMail gửi tệp đính kèm thư từ chuỗi - mã hóa UTF-8
Đây là dòng mã mà tạo ra các MimeBodyPart với tập tin đính kèm:
String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
"UTF-8"),"text/plain; charset=UTF-8");
Tôi cũng đã cố gắng sử dụng các chuỗi mà không cần bất kỳ biến đổi, chỉ sử dụng các byte, bây giờ, như bạn thấy, tôi đang cố gắng để tạo chuỗi từ các byte ...
Tôi đang làm gì sai? (Và tôi nhớ làm điều này trong một dự án khác, hoạt động, nhưng tôi không còn có quyền truy cập vào mã nguồn của nó nữa).
Cảm ơn bạn trước. Timofey.
CẬP NHẬT
Sau khi đọc trả lời của bạn, và sau một số sai nữa thử nghiệm tôi nghĩ rằng nó tốt nhất để công bố các quy tắc điều chỉ gửi thư của tôi. Tôi có các lớp học Mailer
, mà không gửi thư, và các lớp khác chỉ có thể gọi phương thức tĩnh sendMessage()
của chúng tôi để gửi tin nhắn. Và tất cả đều chạy trên 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);
}
Và dòng mà các cuộc gọi điều này trong lớp học khác là:
Mailer.sendMessage("[email protected]", "Test", "No body", "Привет, Я кусок текста");
Và nguồn nguyên liệu của thư, lạ đủ, là (bỏ đi phần đầu dường như không liên quan):
Message-ID: <[email protected]>
Date: Sat, 12 Feb 2011 11:21:01 +0000
Subject: Pages
From: [email protected]
To: [email protected]
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--
Tôi không hiểu, tại sao các bộ ký tự khác với những gì tôi đang cố gắng đặt và chúng đến từ đâu.
Bạn có thấy mã hóa char chính xác trong tập tin mà bạn đã tạo ra? – JSS
Không. Trong tệp được tạo, tôi chỉ thấy các dấu chấm hỏi. – Ibolit