Ibo*_*lit 21 java encoding attachment jakarta-mail
我的应用程序必须发送一个文本文件,它首先必须生成一个String.该文本包含非ASCII符号,所以我希望它是UTF-8.我已经尝试了很多变种,但我收到的所有附件都是一些问号.并且,当我发送与邮件正文相同的文本时,它可以正常工作.
以下是生成带附件的MimeBodyPart的代码行:
String attachment = "??????";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
"UTF-8"),"text/plain; charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)
我也尝试使用没有任何转换的字符串,只使用字节,现在,如你所见,我试图从字节生成一个字符串...
我究竟做错了什么?(我确实记得在另一个项目中这样做,但是我不再能够访问它的源代码).
先感谢您.提莫菲.
UPDATE
阅读完回复后,经过一些不成功的试验后,我认为最好发布我的邮件代码.我有一个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);
}
Run Code Online (Sandbox Code Playgroud)
在另一个类中调用此东西的行是:
Mailer.sendMessage("mymail@example.com", "Test", "No body", "??????, ? ????? ??????");
Run Code Online (Sandbox Code Playgroud)
奇怪的是,邮件的原始来源是(忽略看似无关的标题):
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--
Run Code Online (Sandbox Code Playgroud)
我只是不明白,为什么charsets与我想要设置的不同,以及它们来自哪里.
Ibo*_*lit 22
将内容类型设置为application/octet-stream:
MimeBodyPart attachmentPart = new MimeBodyPart();
try {
DataSource ds = new ByteArrayDataSource(attachment.getBytes("UTF-8"), "application/octet-stream");
attachmentPart = new MimeBodyPart();
attachmentPart.setDataHandler(new DataHandler(ds));
}
catch (Exception e) {
Logger.getLogger("Blina").log(Level.SEVERE, Misc.getStackTrace(e));
}
attachmentPart.setFileName(fileName);
multipart.addBodyPart(attachmentPart);
// Put parts in message
msg.setContent(multipart);
Run Code Online (Sandbox Code Playgroud)
有类似的情况,下面的代码解决了它:
MimeBodyPart att = new MimeBodyPart();
att.setFileName(MimeUtility.encodeText(fileName));
Run Code Online (Sandbox Code Playgroud)
如果问题出在文件名而不是正文中,则以下代码对我的(希伯来语)案例有帮助:
MimeBodyPart attachment = new MimeBodyPart();
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51809 次 |
| 最近记录: |