使用mailto时Outlook不处理多字节字符:

时间:2009-06-10 09:27:35

标签: java windows command-line outlook

我遇到类似described in this question的问题:我使用“mailto”协议从Java打开默认邮件客户端(我现在与Java 5绑定,所以很遗憾我不能使用Desktop API)。

某些电子邮件包含日文文本。字符串已经是UTF-8编码,如下所示:

private void email(String to, String subject, String body)
{
    String encodedSubject = URLEncoder.encode(subject, "UTF-8");
    String encodedBody = URLEncoder.encode(body, "UTF-8");

    String mailto = "mailto:" + to + "?subject=" + encodedSubject + 
        "&body=" + encodedBody;
    String cmd = "cmd.exe /c start \"\" \"" + mailto + "\"";
    Runtime.getRuntime().exec(cmd);
}

日文字符被正确编码为其URL等价物,因此“平面”变为“%E5%B9%B3”,例如;但是,当Outlook打开新邮件窗口时,三字节字符被解释为三个不同的字符 - 因此“%E5%B9%B3”被解释为“å¹³”。

我相信问题在于outlook,因为以下HTML代码段产生相同的效果(SO似乎不允许mailto里面的标签,所以我不能直接提供链接,抱歉):

<html>
    <body>
    <a href="mailto:foo@bar.com?subject=%E5%b9%B3">click me to test!</a>
    </body>
</html>

简而言之,我如何说服Outlook在来自mailto链接时正确解释多字节字符?

编辑:回答约翰内斯的问题:我们有一个Java应用程序,可以在执行某些操作时发送电子邮件。每封电子邮件的标准文本都是从资源包中提取的,在大多数情况下,我们使用JavaMail API没有任何问题;但在这种情况下,要求用户能够在发送之前定制电子邮件。

如果有人可以建议使用非cmd.exe方式产生相同的效果(主题和正文预填充的新邮件窗口) - 并且记住我们与Java 5绑定,那么桌面API很可悲不是一个选择 - 我会很开心!

5 个答案:

答案 0 :(得分:1)

你可以试试这个:

有一个名为的选项:在Outlook @

中启用对mailto:protocol的UTF-8支持

工具&gt;选项&gt;邮件格式&gt;国际选项&gt; [x]为mailto:protocol

启用UTF-8支持

让我们希望它适合你

答案 1 :(得分:1)

在Windows Live Mail中,主题对我来说没问题,但收件人的显示名称没有。 当evertything是UTF-8编码时,Android工作正常,但Windows Live Mail在“收件人:”中显示一些符号,而“主题:”是正确的。当我使用UTF-16“To:”时,Windows Live Mail现在可以使用,但Android仍然可以将其作为UTF-8 ...

答案 2 :(得分:0)

您没有指定任何编码,因此Outlook(或向Outlook提供地址的人)只能猜测。如果是HTMl代码段,请尝试在<head>中明确指定编码(UTF-8)是否会改变该行为。

就cmd而言,它无法真正应对UTF-8。尽管存在问题,它仍将Unicode作为UTF-16处理。

当我在这里尝试此操作时(Windows Live Mail,而不是Outlook),主题中的所有内容都会转换为旧版代码页,因此CJK应该存在问题。

但是,我想知道为什么你试图误用cmd让用户写邮件。那里肯定有更好的选择(即使我现在不知道一个因为我从来不需要它)。

答案 3 :(得分:0)

我猜您的Java邮件工作正常但请确保尝试切换到JavaMail

查看this帖子。默认情况下,Outlook 2003无法正确识别HTML邮件的字符编码(在许多情况下),即使它们包含相应的标记:

 <meta http-equiv="content-type" content="text/html; charset=UTF-8">

您可以切换到Outlook 2007和/或在编辑器中打开邮件并调整邮件属性:

  • 打开邮件
  • 编辑 - &gt;编辑消息
  • 格式 - &gt;编码 - &gt;选择新编码
  • 文件 - &gt;保存

编辑:问题更改后的更正。

编辑2:抱歉没有阅读完整的问题。

我发现你有Java 5约束,但如果实现也与Windows绑定,请考虑使用基于JNI / JNA的解决方案(遗憾的是我不能给你链接)。我还将了解OpenJDK的Desktop API实现并从中提取方法。

另一个选择是以某种方式传递消息而不用URLEncoding它?

此外,如果要求用户在发送之前自定义消息,您可以在应用程序中为该消息提供一个简单的编辑器,并仍然通过JavaMail发送消息。

您还可以提供为用户准备消息的合作方式,将其放在剪贴板上并为用户打开电子邮件客户端。然后用户只需要发出一个CTRL + V来粘贴准备好的文本。

答案 4 :(得分:0)

mailto:链接应使用RFC2047编码而不是UTF。 http://en.wikipedia.org/wiki/MIME

的mailto:?????me@example.com受试者== UTF8乙aGVsbG8 =

http://webnet77.com/cgi-bin/helpers/base-64.pl