首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaMail从字符串编码的UTF-8发送邮件附件

JavaMail从字符串编码的UTF-8发送邮件附件
EN

Stack Overflow用户
提问于 2011-02-11 01:31:07
回答 8查看 56.8K关注 0票数 30

我的应用程序必须发送一个文本文件,它首先必须生成一个字符串。文本包含非ASCII符号,所以我希望它是UTF-8。我尝试了很多变体,但作为附件我收到的都是一些问号。而且,当我发送与消息正文相同的文本时,它可以正常工作。

下面是生成带有附件的MimeBodyPart的代码行:

代码语言:javascript
复制
String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
    "UTF-8"),"text/plain; charset=UTF-8");

我还尝试使用字符串而不进行任何转换,只使用字节,现在,如您所见,我正在尝试从字节生成字符串……

我做错了什么?(我确实记得在另一个项目中这样做过,它可以工作,但我不再有权访问它的源代码)。

提前谢谢你。蒂莫菲。

更新

看过你的回复后,在一些不成功的实验之后,我想最好发布我的邮件的代码。我有一个执行邮件发送的Mailer类,其他类可以只调用它的静态sendMessage()方法来发送消息。这一切都运行在Google App Engine上。

代码语言:javascript
复制
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);
}

在另一个类中调用这个东西的代码行是:

代码语言:javascript
复制
Mailer.sendMessage("mymail@example.com", "Test", "No body", "Привет, Я кусок текста");

奇怪的是,邮件的原始来源是(去掉看似不相关的标题):

代码语言:javascript
复制
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--

我只是不明白,为什么字符集不同于我试图设置的字符集,以及它们来自哪里。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-02-12 21:50:57

将内容类型设置为application/octet-stream

代码语言:javascript
复制
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);
票数 25
EN

Stack Overflow用户

发布于 2013-06-10 16:57:24

有类似的情况,下面的代码解决了它:

代码语言:javascript
复制
MimeBodyPart att = new MimeBodyPart();
att.setFileName(MimeUtility.encodeText(fileName));
票数 8
EN

Stack Overflow用户

发布于 2016-02-14 22:32:38

如果问题出在文件名中,而不是主体中,下面的代码在我的(希伯来语)案例中有帮助:

代码语言:javascript
复制
MimeBodyPart attachment = new MimeBodyPart();
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4960556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档