12

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

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

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

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

open mailto:?subject=MySubject&body=TheBody

需要 URL 转义以将空格替换为%20.

更新在 Windows 上,您必须玩各种游戏才能start正确运行。这是正确的 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);
    }
}
4

9 回答 9

10

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

于 2008-08-26T11:38:21.250 回答
4

1.添加主题行

您可以通过在电子邮件地址后添加以“ ?subject= ”开头的主题来预先填写电子邮件中的主题行。

所以链接现在变成了:

<a href="mailto:someone@yoursite.com?subject=Mail from Our Site">Email Us</a> 

2.发送给多个收件人

邮件可以以抄送 (cc) 或密件抄送 (bcc) 的形式发送给其他收件人。

这以类似的方式完成,通过在初始地址之后放置' ?cc=someoneelse@theirsite.com '。

所以链接看起来像这样:

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com">Email Us</a>

如果您想发送密件抄送,cc 可以简单地替换为 bcc。

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

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

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com, another@thatsite.com, me@mysite.com">Email Us</a> 

来自从现在 404的“mailto”获取更多信息。我从 waybackmachine 检索了内容。

3.组合代码

您可以通过在每个代码之间添加“&”来组合上面的各个代码位。

因此添加

me@mysite.com?subject=Hello&cc=you@yoursite.com&bcc=her@hersite.com

会向我、你和她发送一封主题为“你好”的电子邮件。

4.写电子邮件

您还可以在邮件正文中预先填写邮件的开头,或者根据需要编写整封邮件!要在电子邮件的正文中添加一些内容,就像上面一样简单 -在电子邮件地址之后添加“ ?body= ”。然而,格式化该电子邮件可能有点棘手。要在单词之间创建空格,您必须使用十六进制代码 - 例如每个单词之间的“ %20 ”,创建新行意味着添加“ %0D ”。类似的符号(如$符号)需要用十六进制代码编写。

如果您还希望添加主题行并将副本发送给多个收件人,这可能会导致编写非常长且难以编写的代码。

它将向三个人发送一条消息,主题和消息已填写,您只需添加您的姓名即可。

只看代码!

<a href="mailto:abbeyvet@outfront.net?CC=spooky@outfront.net
&BCC=thomasbrunt@outfront.net&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 现在是 404ing,所以我从 waybackmachine 抓取内容并将其发布在这里,这样它就不会丢失。此外,OP 声明它不是用于网站,这就是这些示例的内容,但其中一些技术可能仍然有用。

于 2008-08-20T03:42:35.547 回答
4

start在 Windows 中工作正常(见下文)。我会使用 Java 内置的 UrlEscape,然后只运行第二次替换“+”字符。

start mailto:"?subject=My%20Subject&body=The%20Body"
于 2008-08-20T04:53:10.837 回答
4

切勿Runtime.exec(String)在 Mac OS X 或任何其他操作系统上使用。如果你这样做,你将不得不弄清楚如何正确引用所有参数字符串等等;这很痛苦,而且很容易出错。

相反,使用Runtime.exec(String[])which 接受一组已经分离的参数。这几乎适用于所有用途。

于 2008-08-26T03:34:25.907 回答
3

我不得不重新实现 URLencode,因为 Java 会使用 + 来表示空格,而 Mail 从字面上理解。

我不知道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
于 2008-08-20T04:03:44.200 回答
3

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

对于百分比编码的 mailto URI hnames 和 hvalues,我使用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 上,这意味着:

  1. 引用论据。
  2. 用 \ 转义引号内的任何 "。
  3. 使用 \ 转义 " 或字符串结尾之前的任何 \。

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

与“start”一样,带有“open”的 ShellExecute 应该在默认客户端中打开 mailto URI。

不确定其他操作系统。

于 2008-08-20T07:51:04.857 回答
2

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)。

于 2008-08-20T03:30:31.487 回答
1

你可以用这个...

main(string[] args){    
String forUri = String.format("mailto:?subject=%s&body=%s",  urlEncode(sub), urlEncode(mailBody));
                        Desktop.getDesktop().mail(new URI(forUri));
}

private static final String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

也用于格式化阅读用 Java 发送电子邮件的简单方法:邮件到链接

于 2012-08-24T10:02:08.487 回答
0

我已经实现了这一点,它在 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 上进行测试。

于 2008-08-20T03:56:38.460 回答