如何以跨平台方式打开带有主题和正文的默认邮件程序?

时间:2020-03-05 18:40:59  来源:igfitidea点击:

如何以跨平台方式打开带有主题和正文的默认邮件程序?

不幸的是,这是针对用Java编写的客户端应用程序,而不是网站。

我希望它可以跨平台的方式工作(这意味着Windows和Mac,对不起Linux)。我很高兴在Windows中执行VBScript,在OS X中执行AppleScript。但是我不知道这些脚本应该包含什么。我希望执行用户的默认程序,而不是仅搜索Outlook或者其他内容。

在OS X中,我尝试执行以下命令:

open mailto:?subject=MySubject&body=TheBody

需要使用URL转义以将%20替换为空格。

在Windows上更新,我们必须玩各种游戏才能使"开始"正确运行。这是正确的Java咒语:

class Win32 extends OS {
    public void email(String subject, String body) throws Exception {
        String cmd = "cmd.exe /c start \"\" \"" + formatMailto(subject, body) + "\"";
        Runtime.getRuntime().exec(cmd);
    }
}

解决方案

回答

Mailto并不是走坏路。但是正如我们提到的,我们需要确保其编码正确。

使用mailto的主要问题是断行。将%0A用于回车,将%20用于空格。

另外,请记住,mailto被视为与各种URL相同,因此对长度的限制也相同。看
http://support.microsoft.com/kb/208427,请注意最大URL长度为2083个字符。这也已确认为mailto
本文中的文章:http://support.microsoft.com/kb/279460/en-us。另外,某些邮件客户端也可能有限制(我相信较早版本的Outlook Express的限制要小得多,例如483个字符或者类似的字符。如果我们希望字符串长于此,则需要考虑其他方法。

顺便说一句,只要我们可以从Java中掏出一个命令(我们不知道是否可以,因为我不使用Java),我们就不必踢出脚本来执行此操作。

回答

1.添加主题行

我们可以在电子邮件地址之后添加主题,并在主题前添加"?subject =",以预填充主题行。

因此,链接现在变为:

<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a>

2.发送给多个收件人

邮件可以复本(cc)或者密抄本(bcc)发送给其他收件人。

可以通过类似的方式完成,方法是在初始地址后添加" [email protected]"。

因此,链接如下所示:

<a href="mailto:[email protected][email protected]">Email Us</a>

如果我们要发送密件抄送,可以将cc替换为密件抄送。

如果我们在页面上有不同主题的链接,这将非常有用。我们可能会在每一页上将电子邮件发送给公司中的适当人员,但同时还会将所有邮件的副本发送到中心地址。

当然,我们可以指定多个其他收件人,只需用逗号分隔收件人列表即可。

<a href="mailto:[email protected][email protected], [email protected], [email protected]">Email Us</a>

源自" 404"从" mailto"获得更多信息。我从waybackmachine检索了内容。

3.组合码

我们可以通过在每个代码之间添加一个"&"来组合上面的各种代码。

因此增加

[email protected]?subject=Hello&[email protected]&[email protected]

会向我(我们和她)发送主题为" Hello"的电子邮件。

4.写电子邮件

我们还可以在邮件正文中预填邮件的开头,或者根据需要写完整的邮件!要将一些内容添加到电子邮件的正文中,再次像在电子邮件地址后的"?body ="上方一样简单。但是,格式化电子邮件可能有些棘手。要在单词之间创建空格,我们将必须在每个单词之间使用十六进制代码,例如'%20',而创建新行将意味着添加'%0D'。类似地,诸如$符号的符号将需要用十六进制代码编写。

如果我们还希望添加一个主题行并将副本发送给多个收件人,则可能会使代码写起来很长且很困难。

它将向三个人发送一条消息,并填写主题和消息,我们所要做的就是添加姓名。

只需看一下代码!

<a href="mailto:[email protected][email protected]
&[email protected]&Subject=Please%2C%20I%20insist
%21&Body=Hi%0DI%20would%20like%20to%20send%20you%20
%241000000%20to%20divide%20as%20you%20see%20fit%20among
%20yourselves%20and%20all%20the%20moderators.%0DPlease%
20let%20me%20know%20to%20whom%20I%20should%20send
%20the%20check.">this link</a>

注意:原始源URL现在可以在其中找到404,因此我从waybackmachine抓取了内容并将其张贴在此处,因此不会丢失。另外,OP指出这些示例不是针对网站的,但是其中某些技术可能仍然有用。

回答

我已经实现了这一点,并且在OS X上也能很好地工作。(Ryan提到的最大URL长度尚未整理。)

public void email(String subject, String body) throws Exception {
    String cmd = "open mailto:";        
    cmd += "?subject=" + urlEncode(subject);
    cmd += "&body=" + urlEncode(body);
    Runtime.getRuntime().exec(cmd);
}

private static String urlEncode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sb.append(ch);
        }
        else {
            sb.append(String.format("%%%02X", (int)ch));
        }
    }
    return sb.toString();
}

我不得不重新实现URLencode,因为Java将使用+来占用空间,而Mail则直接使用了它们。尚未在Windows上进行测试。

回答

I had to re-implement URLencode
  because Java's would use + for space
  and Mail took those literally.

我不知道Java是否具有一些用于对字符串进行urlencoding的内置方法,但是此链接http://www.permadi.com/tutorial/urlEncoding/显示了一些最常见的要编码的字符:

;       %3B
?       %3F
/       %2F
:       %3A
#       %23
&       %24
=       %3D
+       %2B
$       %26
,       %2C
space   %20 or +
%       %25
<       %3C
>       %3E
~       %7E
%       %25

回答

在Windows中,"启动"可以正常工作(请参见下文)。我将使用Java内置的UrlEscape,然后仅对'+'字符进行第二次替换。

start mailto:"?subject=My%20Subject&body=The%20Body"

回答

I don't know if Java has some built-in method for urlencoding the string, but this link http://www.permadi.com/tutorial/urlEncoding/ shows some of the most common chars to encode:

要对mailto URI的hname和hvalue进行百分比编码,请使用http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding中的规则。在http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations下,有一个Java示例可能会有所帮助。

基本上,我使用:

private String encodex(final String s) {
    try {
        return java.net.URLEncoder.encode(s, "utf-8").replaceAll("\+", "%20").replaceAll("\%0A", "%0D%0A");
    } catch (Throwable x) {
        return s;
    }
}

传入的字符串应该是带有\ r \ n的字符串,并且杂散\ r已经被标准化为\ n。

还要注意,仅当我们在命令行中传递的mailto URI参数正确地转义并加引号时,才在上述异常中返回原始字符串才是安全的。

在Windows上,这意味着:

  • 引述论点。
  • 用\括住引号内的任何""。
  • 用" "转义""之前或者字符串末尾的任何" "。

另外,在Windows上,如果像Java中那样处理UTF-16字符串,则可能要使用ShellExecuteW来"打开" mailto URI。如果不这样做,则返回一个s异常(其中某些hvalue不能完全按百分比编码),则最终可能会缩小一些宽字符并丢失信息。但是,并非所有邮件客户端都接受unicode参数,因此理想情况下,我们需要通过ShellExecute传递正确百分比编码的utf8 ascii参数。

像"开始"一样,带有" open"的ShellExecute应该在默认客户端中打开mailto URI。

不确定其他操作系统。

回答

切勿在Mac OS X或者任何其他操作系统上使用Runtime.exec(String)。如果这样做,则必须弄清楚如何正确引用所有参数字符串等等。这是一个痛苦并且非常容易出错。

而是使用Runtime.exec(String []),它接受一个已经分隔的参数数组。这实际上适用于几乎所有用途。

回答

在Java 1.6中,我们可以使用标准方法打开平台的默认邮件程序:
Desktop.mail(URI)方法。URI可用于设置邮件的所有字段(发件人,收件人,正文,主题)。
我们可以在Java SE 6中使用桌面API上查看Java 1.6中桌面集成的完整示例。